C#: 多个 catch 子句

17

考虑以下内容:

try { 
    FileStream fileStream = new FileStream("C:\files\file1.txt", FileMode.Append); }
catch (DirectoryNotFoundException e) 
    { MessageBox.Show("Directory not found. " + e.Message); }
catch (IOException e) 
    { MessageBox.Show("Other IO Error. " + e.Message); }
catch (Exception e) 
    { MessageBox.Show("Other Error. " + e.Message); }

DirectoryNotFoundException异常会被所有三个catch子句捕获吗,还是只会被第一个捕获?

5个回答

27

只是第一个。异常不会传播到所有匹配的catch子句中。

来自C# 4规范,第8.9.5节:

指定异常类型或异常类型的基类型的第一个catch子句被认为是匹配项。如果找到匹配的catch子句,则通过将控制转移到该catch子句的块来完成异常传播。

这里的“完成”部分表示在控制已经被转移之后,特殊处理结束了。


3

只有第一个。Catch块不会继续执行。


3

只有第一个匹配的 catch 会捕获异常,如果您因任何原因需要再次捕获它,则必须重新抛出它,以便“外部”catch子句能够捕获它。


1

只有第一个匹配的 catch 子句会处理异常


1

这是处理异常的正确方式 - 从最具体的异常类型开始,然后逐步回退。但请记住,如果您无法解决或处理异常,请不要捕获它。例如,我假设您的代码在某个文件访问方法中,我会删除最后一个 catch (Exception) 块,因为在这里您无法做任何事情(如果是堆栈溢出、内存不足或其他严重的系统异常怎么办...)


1
你应该始终捕获所有异常,因为用户不应该看到异常的通用显示和堆栈跟踪等信息。 - Craig Johnston
4
不,不是总是。最常见的异常情况只应在表示层的顶部捕获,因为这是您可以处理它们(显示友好错误消息)的唯一位置。 - MattDavey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接