C# 关于异常处理 try-catch语句的使用

在实际应用中,比如涉及文件读写、网络通信时,会因为文件不存在、权限不够、网络异常等原因引发异常,或者对数据库连接、查询、更新等操作,会因为连接超时、语法错误、唯一约束冲突等引发异常。

看过去的代码,当进行上面的这些操作,大家就通常会发现try-catch语句的身影。

不错。在这些情况下我们就可以应用try-catch语句来捕捉异常了。

1、基本语法:

复制代码
try
{
    // 可能会引发异常的代码
}
catch (ExceptionType1 ex1)
{
    // 处理ExceptionType1类型的异常
}
catch (ExceptionType2 ex2)
{
    // 处理ExceptionType2类型的异常
}
finally
{
    // 可选的finally块,无论是否发生异常都会执行
}

这就是它的完整语法。try放置你的处理代码,当发生异常时,就执行cath语句块,假如有finally语句块,即使发生异常也执行。

2、常见用法:

1、捕捉特定异常:

复制代码
try
{
    int[] numbers = { 1, 2, 3 ,4 };
    Console.WriteLine(numbers[5]); // 数组越界异常
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("发生了数组越界异常:" + ex.Message);
}
  • 具体特定的异常常见的有:

|-----------------------------|---------------------------------------------|
| DivideByZeroException | 当在代码中进行除法运算时,如果除数为零,将引发此异常。 |
| IndexOutOfRangeException | 索引超出范围的异常,当尝试访问数组或集合中不存在的索引位置时,将引发此异常。 |
| FileNotFoundException | 文件未找到的异常,当尝试打开或操作不存在的文件时,将引发此异常。 |
| IOException | 输入/输出操作异常,用于捕获各种与输入/输出相关的异常,如文件操作、网络通信等。 |
| SqlException | 与数据库操作相关的异常,在进行数据库连接、查询、更新等操作时可能会引发此异常。 |
| FormatException | 格式化异常,当尝试将字符串转换为其他类型时,如果字符串的格式不符合要求,将引发此异常。 |
| ArgumentNullException | 参数为空异常,当传递给方法或函数的参数为null时,将引发此异常。 |
| InvalidOperationException | 无效操作异常,当进行了不符合当前对象状态或上下文的操作时,将引发此异常。 |
| NotSupportedException | 不支持的操作异常,当尝试执行不受支持的操作时,将引发此异常。 |
| UnauthorizedAccessException | 未授权访问异常,当尝试访问未授权的资源或执行未授权的操作时,将引发此异常。 |

2、处理多个异常类型:

复制代码
try
{
    int result = Divide(10, 0); // 除以0的异常
    Console.WriteLine("结果:" + result);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("除以0异常:" + ex.Message);
}
catch (ArithmeticException ex)
{
    Console.WriteLine("算术异常:" + ex.Message);
}

3、使用finally块:

复制代码
FileStream file = null;
try
{
    file = new FileStream("file.txt", FileMode.Open);
    // 使用文件流进行操作
}
catch (IOException ex)
{
    Console.WriteLine("发生了IO异常:" + ex.Message);
}
finally
{
    // 确保文件流被关闭
    file?.Close();
}

4、抛出异常:可参考:C#异常处理-throw语句-CSDN博客

5、使用异常过滤器:我们是可以使用when关键字进行异常筛选的。

复制代码
try
{
    int result = Divide(10, 0);
    Console.WriteLine("结果:" + result);
}
catch (DivideByZeroException ex) when (ex.Message == "除数不能为0")
{
    Console.WriteLine("除以0异常:" + ex.Message);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("其他除以0异常:" + ex.Message);
}
相关推荐
j_xxx404_3 分钟前
C++算法入门:二分查找合集(二分查找|在排序数组中查找元素的第一个和最后一个位置)
开发语言·c++
ss2736 分钟前
阻塞队列:ArrayBlockingQueue如何用Lock与Condition实现高效并发控制
开发语言·python
CodeCraft Studio9 分钟前
Vaadin 25 正式发布:回归标准Java Web,让企业级开发更简单、更高效
java·开发语言·前端·vaadin·java web 框架·纯java前端框架·企业级java ui框架
Shirley~~12 分钟前
PPTist 幻灯片工具栏Toolbar部分
开发语言·前端·javascript
|晴 天|13 分钟前
Promise 与 async/await 错误处理最佳实践指南
开发语言·前端·javascript
_OP_CHEN16 分钟前
【Python基础】(三)Python 语法基础进阶:条件循环 + 实战案例,从入门到精通的核心跳板
开发语言·python·python入门·条件语句·循环语句·python基础语法
苹果电脑的鑫鑫16 分钟前
.eslintrc.js这个文件作用
开发语言·javascript·ecmascript
ytttr87316 分钟前
matlab进行利用遗传算法对天线阵列进行优化
开发语言·算法·matlab
无限进步_18 分钟前
【C语言】队列(Queue)数据结构的实现与分析
c语言·开发语言·数据结构·c++·算法·链表·visual studio
特立独行的猫a21 分钟前
Google C++ 编码规范核心要点总结 (2025精简版)
开发语言·c++·编码规范