异常处理⚓︎
一、异常概述⚓︎
异常处理功能有助于处理在程序运行期间发生的任何意外或异常情况。
异常处理功能使用 try
、catch
和 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
块可处理该方法。 例如:
C# 程序员使用 try 块来对可能受异常影响的代码进行分区。 关联的 catch 块用于处理生成的任何异常。 finally 块包含无论 try
块中是否引发异常都会运行的代码,如发布 try
块中分配的资源。
Note
try
块需要一个或多个关联的catch
块或一个finally
块,或两者皆之;- 如果 try 块内的代码执行顺利,则不会程序跳转到catch块(如果有的话),而是执行catch块后面的代码,可能是finnaly块(如果有的话)也可能是后续代码。
语法: