位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 错误处理 try...catch...finally

提问人:刘团圆发布时间:2020-12-04

    C#语言包含结构化异常处理(Structured Exception Handling,SEH)的语法。用.3个关键字可以标记出能处理异常的代码和指令,如果发生异常,就使用这些指令处理异常。用于这个目的的3个关键字是try、catch和finally。它们都有一个关联的代码块,必须在连续的代码行中使用。其基本结构如下:

try

{

  …

}

catch (<exceptionType> e) when {filterlsTrue)

{

  <await methodName(e);>

  …

}

finally

{

  <await methodName;>

  …

}

    也可在catch或finally块内使用C# 6中引入的await。await关键字用于支持先进的异步编程技术,避免瓶颈,且可以提高应用程序的总体性能和响应能力。

    也可以只有try块和finally块,而没有catch块,或者有一个try块和多个catch块。如果有一个或多个catch块,finally块就是可选的,否则就是必需的。这些代码块的用法如下:

    •try—包含抛出异常的代码(在谈到异常时,C#语言用“抛出”这个术语表示“生成”或“导致”)。

    •catch—包含抛出异常时要执行的代码。catch块可使用<exceptionType>,设置为只响应特定的异常类型(如System.IndexOutOfRangeException),以便提供多个catch块。还可以完全省略这个参数,让通用的catch块响应所有异常。C# 6引入了一个概念“异常过滤”,通过在异常类型表达式后添加when关键字来实现。如果发生了该异常类型,且过滤表达式是true,就执行catch块中的代码。

    •finally—包含始终会执行的代码,如果没有产生异常,则在try块之后执行,如果处理了异常,就在catch块后执行,或者在未处理的异常“上移到调用堆栈”之前执行。“上移到调用堆栈”表示,SEH允许嵌套try...catch...finally块,可以直接嵌套,也可以在tty块包含的函数调用中嵌套。例如,如果在被调用的函数中没有catch块能处理某个异常,就由调用代码中的catch块处理。如果始终没有匹配的catch块,就终止应用程序。finally块在此之前处理正是其存在的意义,否则也可在try...catch...finally 结构的外部放置代码。关于嵌套功能,后面还会进一步讨论,所以现在有些不明白也不必担心。

在try块的代码中出现异常后,依次发生的事件如下,如下图所示:

image.png

    •try块在发生异常的地方中断程序的执行。

    •如果有catch块,就检查该块是否匹配已抛出的异常类型。如果没有catch块,就执行finally块(如果没有catch块,就一定要有finally块)。

    •如果有catch块,但它与已发生的异常类型不匹配,就检查是否有其他catch块。

    •如果有catch块匹配己发生的异常类型,且有一个异常过滤器是true,就执行它包含的代码,再执行finally块(如果有的话)。

    •如果有catch块匹配己发生的异常类型,但没有异常过滤器,就执行它包含的代码,再执行finally块(如果有的话)。

    •如果catch块都不匹配己发生的异常类型,就执行finally块(如果有的话)

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部