C# 语言的异常处理功能可帮助你处理程序运行时发生的任何意外或异常情况。 异常处理使用 try
、catch
和 finally
关键字来尝试可能不成功的操作,以便在您认为这样做是合理时处理异常,并在完成后清理资源。 公共语言运行时(CLR)、.NET 或第三方库或应用程序代码可以生成异常。 异常是通过使用 throw
关键字创建的。
在许多情况下,异常可能不是由代码直接调用的方法引发的,而是由调用堆栈中其他方法进一步引发的。 引发异常时,CLR 将展开堆栈,查找具有 catch
特定异常类型的块的方法,并执行它找到的第一个此类 catch
块。 如果调用堆栈中的任何位置都找不到适当的 catch
块,它将终止进程并向用户显示消息。
在以下示例中,方法用于测试除数是否为零,并捕获相应的错误。 如果没有异常处理,此程序将因 DivideByZeroException 未处理 错误而终止。
public class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new DivideByZeroException();
return x / y;
}
public static void Main()
{
// Input for test purposes. Change the values to see
// exception handling behavior.
double a = 98, b = 0;
double result;
try
{
result = SafeDivision(a, b);
Console.WriteLine($"{a} divided by {b} = {result}");
}
catch (DivideByZeroException)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
异常概述
异常具有以下属性:
- 异常是最终全都派生自
System.Exception
的类型。 - 在可能抛出异常的语句周围使用
try
代码块。 - 在块中
try
发生异常后,控制流将跳转到调用堆栈中任意位置存在的第一个关联的异常处理程序。 在 C# 中,关键字catch
用于定义异常处理程序。 - 如果没有给定异常的异常处理程序,程序将停止执行并显示错误消息。
- 除非可以处理异常并让应用程序一直处于已知状态,否则不捕获异常。 如果捕获
System.Exception
,使用throw
代码块末尾的catch
关键字重新抛出异常。 -
catch
如果块定义异常变量,则可以使用它来获取有关所发生的异常类型的详细信息。 - 异常可以通过使用
throw
关键字由程序显式生成。 - 异常对象包含有关错误的详细信息,例如调用堆栈的状态和错误的文本说明。
- 无论是否引发异常,都会执行块中的
finally
代码。 使用finally
块来释放资源,例如关闭在try
块中打开的任何流或文件。 - .NET 中的托管异常是在 Win32 结构化异常处理机制的基础上实现的。 有关详细信息,请参阅 结构化异常处理(C/C++) 和 Win32 结构化异常处理深度解析的速成课程。
C# 语言规范
有关详细信息,请参阅 C# 语言规范中的异常。 语言规范是 C# 语法和用法的明确来源。