捕获特定异常与一般异常

fwa*_*wan -2 c# vb.net

我的一位同事问,如果您执行具有错误表名的查询,我会得到什么异常。我无法回答,因为我总是捕捉到像下面的代码这样的异常,

try
{
    ExecuteQuery();
}
catch(Exception ex)
{
    //show an error message
}
Run Code Online (Sandbox Code Playgroud)

所以我不知道在实际发生之前会引发什么样的错误。但我喜欢以这种方式进行编码,因为我可以简单地将 catch 块复制并粘贴到需要尝试和 catch 块的任何位置。

我的问题是知道将抛出哪些异常并尝试尽可能多地捕获特定异常是否重要?

Hab*_*bib 5

我的问题是知道将抛出哪些异常并尝试尽可能多地捕获特定异常是否重要?

这取决于。如果您要捕获并处理特定异常,那么首先捕获特定异常然后再捕获基本异常是有意义的。

一个例子可能是确定插入重复主键,您希望用户输入不同的值,因为表不允许插入重复键。在这种情况下,您将SqlException先捕获,然后再用另一个块Exception来捕获任何其他块。

try
{
    ExecuteQuery();
}
catch (SqlException sqlException)
{
    if (sqlException.Number == 2627) //duplicate key
    {
        // ask user to enter new value, repeat `ExecuteQuery`
    }
}
catch (Exception ex)
{
    //show an error message
}
Run Code Online (Sandbox Code Playgroud)

如果不捕获,SqlException 您将无法访问Number包含特定SqlException.

(顺便说一下,上面的代码只是一个捕获和处理特定异常的例子,可以通过先检查表中的值来避免插入重复键)