【问题标题】:c# Best practice of catching exceptions with try-catch?c#使用try-catch捕获异常的最佳实践?
【发布时间】:2015-12-10 17:47:03
【问题描述】:

假设我需要运行 methodA,methodA 会抛出 FormatException。

如果我写这个块:

try
{
    methodA();
}
catch (Exception ex)
{
    methodB();
}
catch (FormatException ex)
{
    methodC();
}

它是否会运行 methodC,知道 FormatException 也是一个异常,因此会进入 methodB 的 catchblock。

还是这样写比较好:

try
{
    methodA();
}
catch (Exception ex)
{
    if(ex is FormatException)
    {
        methodC();
    } else
    {
        methodB();
    }
}

【问题讨论】:

  • 捕捉异常时的顺序很重要。
  • 你的第一个例子更好,但你的 catch 块的顺序应该总是从最具体到最不具体。因此,最后一个 catch 块应该捕获 Exception。
  • 您建议的第二种方法最好。 Here's an example 的类似问题。
  • @TestWell 如果您对每种类型的异常执行不同的操作,则不会。
  • @TestWell 完全没有必要捕获一个泛型异常然后测试类型。

标签: c# .net exception exception-handling try-catch


【解决方案1】:

不,它永远不会运行 methodC,但如果你交换 catch 的顺序,它会:

try
{
    methodA();
}
catch (FormatException ex)
{
    methodC();    
}
catch (Exception ex)
{
    methodB();
}

引用MSDN

可以在同一个 try-catch 语句中使用多个特定的 catch 子句。在这种情况下,catch 子句的顺序很重要,因为 catch 子句是按顺序检查的。在不太具体的异常之前捕获更具体的异常。如果您对 catch 块进行排序以使后面的块永远无法到达,编译器会产生错误。

【讨论】:

    【解决方案2】:

    catch 块总是根据特定的异常执行。

    所有的异常都是从 System.Exception 类派生的,所以它应该在你的最后一个 catch 块中。

    所有其他 catch 块应该属于您假定的特定异常类(在您的情况下为 FormatException),可以由您的方法调用。

    Dave's Answer 就是一个很好的例子,如果你的 catch 块中的异常有一些层次关系,那么最好以相反的层次顺序重新排列它们。

    【讨论】:

      猜你喜欢
      • 2013-12-28
      • 2013-12-05
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多