跳转至

异常处理⚓︎

一、异常概述⚓︎

异常处理功能有助于处理在程序运行期间发生的任何意外或异常情况。

异常处理功能使用 trycatch 和 finally 关键字来尝试执行可能失败的操作、在你确定合理的情况下处理故障,以及在事后清除资源。

公共语言运行时 (CLR)、.NET/第三方库或应用程序代码都可生成异常。

异常是最终全都派生自 System.Exception 的类型,并使用 throw 关键字创建而成。

Tip

在许多情况下,异常并不是由代码直接调用的方法抛出,而是由调用堆栈中再往下的另一方法抛出。 如果发生这种异常,CLR 会展开堆栈,同时针对特定异常类型查找包含 catch 代码块的方法,并执行它找到的首个此类 catch 代码块。 如果在调用堆栈中找不到相应的 catch 代码块,将会终止进程并向用户显示消息。

二、异常处理⚓︎

01 抛出异常⚓︎

异常由从Exception派生的类表示。 此类标识异常的类型,并包含详细描述异常的属性。 引发异常涉及创建异常派生类的实例,配置异常的属性(可选),然后使用 throw 关键字引发该对象。 例如:

抛出异常
// 自定义的异常类
class CustomException : Exception
{
    public CustomException(string message)
    {
    }
}

private static void TestThrow()
{
    // 该方法通过 throw 抛出异常
    throw new CustomException("Custom exception in TestThrow()");
}

02 捕获与处理异常⚓︎

异常由遇到错误的代码引发,由能够更正错误的代码捕捉。一旦引发了一个异常,此异常会在调用堆栈中传播,直到找到针对它的 catch 语句。 未捕获的异常由系统提供的通用异常处理程序处理,该处理程序会显示一个对话框。

引发异常后,运行时将检查当前语句,以确定它是否在 try 块内。 如果在,则将检查与 try 块关联的所有 catch 块,以确定它们是否可以捕获该异常。 Catch 块通常会指定异常类型;如果该 catch 块的类型与异常或异常的基类的类型相同,则该 catch 块可处理该方法。 例如:

捕获与处理异常
try
{
    TestThrow();
}
catch (CustomException ex)
{
    System.Console.WriteLine(ex.ToString());
}

C# 程序员使用 try 块来对可能受异常影响的代码进行分区。 关联的 catch 块用于处理生成的任何异常。 finally 块包含无论 try 块中是否引发异常都会运行的代码,如发布 try 块中分配的资源。

Note

  1. try 块需要一个或多个关联的 catch 块或一个 finally 块,或两者皆之;
  2. 如果 try 块内的代码执行顺利,则不会程序跳转到catch块(如果有的话),而是执行catch块后面的代码,可能是finnaly块(如果有的话)也可能是后续代码。

语法:

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    //处理异常的代码放在这里
    //只捕获你知道如何处理的异常
    //永远不要捕获基类系统。
    //没有异常,在catch块的末尾重新抛出它.
}
try
{
    // Code to try goes here.
}
finally
{
    // try块之后执行的代码在这里.
}
try
{
    // try块
}
catch (SomeSpecificException ex)
{
    // 异常处理块
}
catch (SomeSpecificException ex)
{
    // 异常处理块
}
finally
{
    // 在try(可能还有catch)块之后执行的代码在这里。
}