假设我需要运行 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();
}
}
答案 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块中的异常有一些层次关系,那么最好按照反向层次顺序对它们重新排序。