捕获特定异常与一般异常

时间:2015-05-06 14:50:25

标签: c# vb.net

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

try
{
    ExecuteQuery();
}
catch(Exception ex)
{
    //show an error message
}

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

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

3 个答案:

答案 0 :(得分:4)

这取决于。但一般来说,如果您希望应用程序在不同情况下的行为不同,最好捕获特定的异常。例如,FileNotFoundException可以告诉您用户需要验证路径。常规catch块在您的应用程序的最高级别非常有用,但是在下一行中进一步具体化可以让您更好地控制如何响应特定问题。

答案 1 :(得分:4)

  

我的问题是知道什么是例外是很重要的   抛出并尽量使尽可能多的特定捕获异常?

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

一个示例可能是确定重复主键的插入,您希望用户输入不同的值,因为该表不允许插入重复键。在这种情况下,您将首先捕获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
}

如果不抓取SqlException,您将无法访问Number字段,其中包含有关特定SqlException的详细信息。

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

答案 2 :(得分:0)

如果您想向用户显示有关例外的个性化消息,这一点很重要。例如:如果它是NullException,它会显示带有一些代码的消息,例如5504.这个数字他/她说帮助台告知问题。有关此问题的文章是here