捕获 C# 异常

4

正确的做法是什么。

从最具体到最一般或相反地捕获异常。

如果我写

try
{
...
}
catch( Exception e )
{
...
}
catch( NullReferenceException nre )
{
...
}

NullReferenceException nre会被捕获吗?


19
易于测试,确实可靠。 - Marc Gravell
关于异常的一些更多技巧。处理异常的最佳实践 - Fredrik Norlin
测试某件事情是否会发生真的很容易吗? - eomeroff
1
在 try 块中放置 throw new NullReferenceException(),如果该 catch 语句未被调用,则没有其他情况需要测试。 - Joel McBeth
那甚至无法编译。 - Amit Kumar Ghosh
9个回答

14
try
{
...
}
catch( NullReferenceException nre )
{
...
}
catch( Exception e )
{
...
}

同时,我不会捕获NullReferenceException异常,而是在实际访问之前测试我要访问的值是否为空,或使用空合并运算符(??)确保不会发生此异常。

应避免捕获通用的Exception。在我看来,你只应该在一些全局异常处理程序中这样做,因为每次调用方法时很少能处理所有可能出现的异常情况。在这种情况下,如果有任何特定的异常,只需捕获它们并采取适当的措施即可。


2
不行,你必须从最具体的开始到最一般的结束。你的例子应该是这样的。
try
{

}
catch(NullReferenceException nre)
{

}
catch(Exception e)
{

}

请查看这里(MSDN)


1

1
不应该从一般情况开始捕获异常,而是应该从最具体的情况开始。

1

从最派生到最不派生


1
一个 try 块可能会抛出多个异常,可以通过多个 catch 块来处理。记住,更具体的 catch 块应该在通用的 catch 块之前。否则编译器将会显示编译错误。 来源

0
为了捕获异常,NullReferenceException 应该作为第一个放入 catch 列表中的异常。
try {
    ...
} catch (NullReferenceException ex) {
    ....
} catch (Exception ex) {
    ...
}

这指定了您希望以特定方式处理NullReferenceException,即您有具体的事情要做。然后,让其他类型的异常通过最通用的catch语句。另一方面,应避免非特定的异常处理,正如此MSDN文章所建议的那样:异常处理

此外,最好在尝试访问对象之前验证要访问的对象是否为null(Visual Basic中的Nothing),而不是让代码访问该对象并在其为null时抛出此异常。以下是有关此问题的有用链接:.NET中的异常处理最佳实践


0

当然,它是从最具体到最一般的。

try {
   ...
} catch (IOException ex) {
  ....
} catch (Exception ex) {
   ...
}

0

最具体的先

NullReferenceException异常会被捕获吗?

真的

不会被捕获


你确定吗?在这个例子中,如何捕获NRE(空引用异常)? - Dzinx
这不是真的,你可以检查。 - Andrey
我的意思是它永远不会被捕捉到,这是你的意思吗? - Andrey
这实际上是不正确的;你将无法编译代码。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接