你应该抓住所有例外吗?

时间:2012-06-25 14:28:44

标签: c#

这不是'如何抓住所有例外',而是'你应该抓住所有例外'吗?在C#.NET中,我注意到了大量的异常。是否可以计划捕获每个例外?

例如,DirectoryInfo()构造函数抛出4个异常。我应该计划捕捉这些还是只抓住我能处理的那些?也许让其他人冒泡到Main(),在那里我有一个捕获所有,然后告诉用户有一个未捕获的异常。在所有这些可能的例外情况下,您的代码可能会变得比实际代码更多的异常处理。

4 个答案:

答案 0 :(得分:14)

只捕获那些有意义的处理你编写代码的抽象级别。大多数例外情况只会在高于被抛出的范围内被捕获。

是的,你是对的。 :)

答案 1 :(得分:2)

您应该捕获您期望的异常 - 并且优雅地在您不期望的异常上失败(通过在常规异常处理程序中捕获它们)。

在你的例子中 - 创建DirectoryInfo()可以抛出多个异常 - 但没有理由你不能只是

try 
{ 
   var di = new DirectoryInfo(somePath);
}
catch(Exception ex)  
{
   // Messagebox/alert the user etc, gracefully exit/cancel/throw if needed
}

您可能希望捕获安全异常并提供其他一些代码,这样做,但保留您的“一般情况”处理程序

try 
{ 
   var di = new DirectoryInfo(somePath);
}
catch(SecurityException ex) 
{
   // Carry on but use a default path or something etc
}
catch(Exception ex)  
{
   // Messagebox/alert the user etc, gracefully exit/cancel
}

答案 2 :(得分:0)

通常,您应该只捕获您知道如何处理的异常。冒泡异常的目的是允许代码的其他部分捕获它们,如果它们可以处理它们,那么在一个级别捕获所有异常可能不会得到你想要的结果。

在顶层,你可能希望有一个全能的方式给用户一个友好的错误信息,这可能表示你的程序处理错误,你可能需要弄清楚如何处理它正常。

在某些情况下(例如OutOfMemoryException),实际上没有办法优雅地处理(除了退出),你绝对应该让那些泡沫至少达到UI的界限优雅的退出。

答案 3 :(得分:0)

抓住那些你想要处理的东西 逻辑非常简单,你会对剩下的“抛出”做什么呢? 除非你想做什么(逻辑\日志记录\错误信息),你只是要重新投掷然后你没有理由赶上。