捕获条款的顺序

Gur*_*epS 3 c# exception-handling

使用框架方法时,在突出显示它时得到的描述将列出可能引发的异常.

如果按此顺序编写catch处理程序是否重要?例如,SqlConnection.Open()可以抛出:

System.InvalidOperationException System.Data.SqlClient.SqlException

它按此顺序列出.我的捕捉处理程序应遵循此顺序吗?如果是这样,为什么?

此外,某些方法(如SqlDataAdapter.Fill())返回一个int,但如果我没有存储返回值的变量,则Visual Studio不会报告错误.为什么?

谢谢

tec*_*ile 9

除非catch处理程序中指定的异常之一继承自另一个处理程序中指定的另一个异常,否则该顺序是无关紧要的,在这种情况下,应该首先发出更多派生的catch(或者永远不会调用它).

运行时将按列出的顺序遍历catch块,执行匹配的第一个,所以如果你有以下内容,即使抛出了ArgumentException,也只会执行第一个catch块:

try
{
  throw new ArgumentException("foo");
}
catch (Exception ex)
{
}
catch (ArgumentException aex)
{
  // Will never be executed.
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*ens 5

(我同意Mitch,按照优先顺序捕获您的情况,因为它使代码更易于维护.)

我还想补充一点,你必须按照从最低子类到最高父类的继承顺序捕获.

例如,如果要捕获System.Exceptions和System.InvalidOperationExceptions,则必须首先捕获InvalidOperationException,因为它是System.Exception的子类.如果您首先获得System.Exception的catch,那么优先级将会触发InvalidOperationException的catch块.