1. C#异常的概念
C#是一种面向对象的编程语言,异常处理是其中的重要概念之一。异常是在程序执行过程中发生的错误或异常情况,可能导致程序无法正常继续执行。C#提供了异常处理的机制,允许开发人员在程序中捕获和处理异常,以保证程序的稳定性和可靠性。
1.1 异常的分类
异常可以分为两类:受控异常和不受控异常。
受控异常(Checked Exception)是指在编译期间就可以被检查到的异常,需要通过try-catch语句来捕获和处理。例如,输入输出流的异常、数据库访问的异常等。
不受控异常(Unchecked Exception)是指在运行时才能发现的异常,不需要强制捕获处理。例如,空引用异常、数组越界异常等。当不受控异常发生时,程序的执行会被中断。
1.2 异常处理的目的
异常处理的主要目的是保证程序的稳定性和可靠性。当程序出现异常时,如果没有进行处理,程序可能会崩溃或者产生不正确的结果。通过捕获和处理异常,程序可以在发生异常时做出合适的应对,继续执行下去或者给出错误提示,保证程序的正常运行。
2. C#的异常处理机制
C#异常处理机制采用了try-catch-finally语句块来处理异常。try中的代码块是可能抛出异常的代码,catch用于捕获并处理异常,finally用于执行无论是否发生异常都需要执行的代码。
2.1 try-catch语句
try-catch语句用于捕获并处理异常。当try块中的代码抛出异常时,catch块可以处理该异常,并根据情况采取相应的措施。
try
{
// 可能抛出异常的代码
}
catch (Exception ex)
{
// 异常处理代码
}
在catch块中,可以根据需要对异常进行处理,可以打印异常信息、记录日志等。使用ex.Message可以获取异常的错误信息。
2.2 catch块的异常过滤
catch块可以指定捕获特定类型的异常,也可以通过多个catch块来捕获不同类型的异常。
try
{
// 可能抛出异常的代码
}
catch (FileNotFoundException ex)
{
// 处理文件未找到异常
}
catch (IOException ex)
{
// 处理输入输出异常
}
catch (Exception ex)
{
// 处理其他类型的异常
}
上述代码中,首先捕获了FileNotFoundException异常,然后捕获了IOException异常,最后通过Exception捕获其他类型的异常。
2.3 finally语句
finally语句块中的代码会在try-catch语句块执行完毕后无论是否发生异常都会被执行。可以在finally语句块中进行一些必要的清理工作,例如关闭打开的文件、释放资源等。
try
{
// 可能抛出异常的代码
}
catch (Exception ex)
{
// 异常处理代码
}
finally
{
// finally语句块中的代码
}
3. 常见的异常类
C#中有许多内置的异常类用于处理各种可能发生的异常情况。
3.1 ArgumentNullException
当一个方法或构造函数的参数值为null时抛出的异常。例如:
public void PrintString(string str)
{
if (str == null)
{
throw new ArgumentNullException(nameof(str), "字符串不能为空");
}
Console.WriteLine(str);
}
在上述代码中,如果传入的字符串为空,会抛出一个ArgumentNullException异常,并指定参数名称和异常消息。
3.2 ArgumentOutOfRangeException
当一个方法或属性的参数值超出有效范围时抛出的异常。
public void SetAge(int age)
{
if (age < 0 || age > 100)
{
throw new ArgumentOutOfRangeException(nameof(age), "年龄必须在0到100之间");
}
this.age = age;
}
在上述代码中,如果设置的年龄超出了有效范围,会抛出一个ArgumentOutOfRangeException异常,并指定参数名称和异常消息。
3.3 DivideByZeroException
当除法运算中除数为0时抛出的异常。
预览部分 。。。。。