c#使用try-catch捕获异常的最佳实践?

时间:2015-09-14 16:34:26

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

假设我需要运行 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();
    }
}

2 个答案:

答案 0 :(得分:10)

不,它不会运行methodC,但如果您更换catch的订单,它将会:

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

引用MSDN

  

可以在同一个try-catch语句中使用多个特定的catch子句。在这种情况下,catch子句的顺序很重要,因为catch子句是按顺序检查的。在不太具体的例外之前捕获更具体的例外。如果您订购了catch块,编译器会产生错误,以便永远无法访问以后的块。

答案 1 :(得分:1)

始终根据特定异常执行catch块。

所有异常都是从System.Exception类派生的,因此它应该位于最后一个catch块中。

您假设的特定Exception类(在您的情况下为FormatException)的所有其他catch块都可以由您的方法调用。

Dave的答案是一个完美的例子,如果你的catch块中的异常有一些层次关系,那么最好按照反向层次顺序对它们重新排序。