- Try...Catch...Finally 结构执行流程:
- Try 块执行:程序首先进入 Try 块,开始执行其中的代码。如果在 Try 块执行过程中没有发生异常,那么 Try 块中的所有代码将正常执行完毕,然后跳过 Catch 块,直接执行 Finally 块(如果存在)。
- 异常发生:当 Try 块中的代码引发异常时,立即停止 Try 块中剩余代码的执行。CLR(公共语言运行时)会寻找匹配的 Catch 块来处理该异常。
- Catch 块匹配与执行:CLR 从第一个 Catch 块开始检查,看其异常类型是否与抛出的异常类型匹配(包括继承关系,即捕获的异常类型可以是抛出异常类型的基类)。找到匹配的 Catch 块后,执行该 Catch 块中的代码,然后执行 Finally 块(如果存在)。如果没有找到匹配的 Catch 块,异常将继续向上层调用栈传递。
- 在 Catch 块中根据不同异常类型针对性处理:
- 可以使用多个 Catch 块,每个 Catch 块指定不同的异常类型。例如:
Try
'可能引发多种异常的复杂操作
Dim result As Integer = 10 / 0 '假设这行代码可能引发除零异常
Catch ex1 As DivideByZeroException
'处理除零异常
Console.WriteLine("发生除零异常: " & ex1.Message)
Catch ex2 As FormatException
'处理格式异常
Console.WriteLine("发生格式异常: " & ex2.Message)
Finally
'Finally 块代码
Console.WriteLine("Finally 块执行")
End Try
- 在这个例子中,当 Try 块中的代码引发
DivideByZeroException
时,会执行第一个 Catch 块;如果引发 FormatException
,会执行第二个 Catch 块。
- Finally 块执行时机:
- 正常执行情况:当 Try 块中没有发生异常,正常执行完毕后,Finally 块会紧接着 Try 块执行。
- 异常处理情况:当 Try 块中发生异常并被 Catch 块捕获处理后,Finally 块会在 Catch 块执行完毕后执行。
- 未捕获异常情况:即使 Try 块中发生的异常没有被当前的 Catch 块捕获(异常向上层调用栈传递),Finally 块依然会在异常传递之前执行。例如:
Try
Dim result As Integer = 10 / 0
Catch ex As Exception
'这里不处理 DivideByZeroException,异常继续传递
Console.WriteLine("捕获到异常,但不处理: " & ex.Message)
Finally
Console.WriteLine("Finally 块执行,即使异常未完全处理")
End Try
- 在这个例子中,虽然
DivideByZeroException
没有被完全处理(只是捕获后未处理),但 Finally 块依然会执行。