2012-06-25 28 views
10

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

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

+0

http://stackoverflow.com/questions/1454266/net-catch-general-exceptions http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions –

+4

就我个人而言,我最终使用'finally ''很多**比我使用过的更多'catch' –

+2

@marc:这是我无法在几分钟前提出问题的原因吗? ;) –

回答

14

只有捕捉那些在编写代码的抽象级别上有意义的处理。大多数例外只会被捕获到比它们抛出的更高的层次。

所以是的,你是对的。 :)

+3

这。只处理可以处理的异常。 – hometoast

0

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

在顶层,您可能希望有一个全面的方法来给用户一个友好的错误信息,并且这可能表示您的程序错误处理某些内容,您可能需要弄清楚如何处理它正确。

有些情况下(例如OutOfMemoryException),确实没有办法优雅地处理(除了退出),并且您应该让这些泡泡至少达到UI的优雅退出。

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 
} 
0

只要抓住那些你可以和想要处理。
逻辑非常简单,你将如何处理剩下的“throw”?
除非你想要做的事情(逻辑\日志记录\错误信息),你只是要重新抛出然后你没有理由赶上。