Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 捕获特定异常与一般异常_C#_Vb.net - Fatal编程技术网

C# 捕获特定异常与一般异常

C# 捕获特定异常与一般异常,c#,vb.net,C#,Vb.net,我的一位同事问,如果执行一个表名错误的查询,我会遇到什么异常。我无法回答,因为我总是捕获下面的代码之类的异常 try { ExecuteQuery(); } catch(Exception ex) { //show an error message } 因此,在实际发生之前,我不知道会出现什么样的错误。但我喜欢用这种方式编码,因为我可以简单地将catch块复制并粘贴到需要try-and-catch块的任何地方 我的问题是,知道将抛出哪些异常并尝试尽可能多地创建特定的catch异

我的一位同事问,如果执行一个表名错误的查询,我会遇到什么异常。我无法回答,因为我总是捕获下面的代码之类的异常

try
{
    ExecuteQuery();
}
catch(Exception ex)
{
    //show an error message
}
因此,在实际发生之前,我不知道会出现什么样的错误。但我喜欢用这种方式编码,因为我可以简单地将catch块复制并粘贴到需要try-and-catch块的任何地方


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

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

我的问题是知道哪些例外情况很重要吗 抛出并尝试创建尽可能多的特定捕获异常

视情况而定。如果要捕获并处理特定异常,那么首先捕获特定异常,然后捕获基本异常是有意义的

一个例子是确定重复主键的插入,您希望用户输入不同的值,因为表不允许插入重复主键。在这种情况下,您将首先捕获
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
,您将无法访问包含特定
SqlException
详细信息的
Number
字段


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

如果要向用户显示有关异常的个性化消息,这一点很重要。例如:如果它是一个NullException,它将显示一条带有一些代码的消息,例如5504。他/她告诉帮助台这个号码以告知问题。关于这一点的文章是

@fwan。。如果您使用的是例如Sql Server,您可以在异常上进行google搜索,并且异常类型可以在
SqlException
上进行搜索。。我相信所有例外情况都很重要,但这取决于您想报告的关于ex.ToString()或ex.Message的内容。。或者其他一些你可以找到的房产。。stacktrace…等等。。从格兰特所说的进一步来看,我想说的是,考虑是否希望捕获任何其他异常并以不同的方式处理它们可能是一个好主意。您想像处理自定义异常或文件访问错误一样处理空指针异常吗?但当我使用常规异常时,它会告诉我引发了什么类型的错误,如IndexOutfrance、NullReferenceException等,这样用户就可以告诉我错误消息,我就知道发生了什么。是的,我知道。但要像用户一样思考。想象他/她正在给你以外的人打电话。想象用户在屏幕上看到消息“…IndexOutOfBoundsException…”。“如果不捕获
SqlException
您将无法访问数字字段”,这对用户来说是不友好的