【问题标题】:C#: multiple catch clausesC#:多个 catch 子句
【发布时间】:2011-07-19 12:38:57
【问题描述】:

考虑以下几点:

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 子句处理还是仅由第一个子句处理?

【问题讨论】:

    标签: c# exception-handling try-catch


    【解决方案1】:

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

    【讨论】:

    • 您应该始终捕获所有异常,因为用户不应该看到堆栈跟踪等的一般显示异常。
    • 不,不是总是。最通用的异常应该只在表示层的最顶层被捕获,因为这是唯一可以对它们做任何事情的地方(显示一个很好的错误消息)。
    【解决方案2】:

    只有第一个匹配的捕获捕获异常,如果您出于任何原因需要再次捕获它,您将不得不再次抛出它,以便“外部”捕获原因能够捕获它。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        只有第一个。 Catch-blocks 不会通过。

        【讨论】:

          【解决方案5】:

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

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

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

          这里的“完成”部分表示控制权转移后,特殊处理结束,有效。

          【讨论】:

            猜你喜欢
            • 2010-10-14
            • 1970-01-01
            • 1970-01-01
            • 2014-12-22
            • 1970-01-01
            • 2016-05-08
            • 1970-01-01
            • 2011-12-17
            相关资源
            最近更新 更多