这不是'如何捕获所有异常',而是'你应该捕获所有异常'?在C#.NET中,我注意到了大量的例外。计划捕捉每个异常是否明智?您是否应该捕获所有异常?
例如,DirectoryInfo()
构造函数会抛出4个异常。我应该计划抓住这些还是只抓住我能处理的那些?也许让其他人冒泡到Main()
那里我有一个捕捉所有,然后告诉用户有一个未捕获的异常。就像所有这些可能的例外情况一样,您的代码可能会比实际代码变得更多异常处理。
这不是'如何捕获所有异常',而是'你应该捕获所有异常'?在C#.NET中,我注意到了大量的例外。计划捕捉每个异常是否明智?您是否应该捕获所有异常?
例如,DirectoryInfo()
构造函数会抛出4个异常。我应该计划抓住这些还是只抓住我能处理的那些?也许让其他人冒泡到Main()
那里我有一个捕捉所有,然后告诉用户有一个未捕获的异常。就像所有这些可能的例外情况一样,您的代码可能会比实际代码变得更多异常处理。
通常,您应该只捕获您知道如何处理的异常。异常冒泡的目的是允许代码的其他部分捕获它们,如果它们能够处理它们,那么在一个级别捕获所有异常可能不会让您获得期望的结果。
在顶层,您可能希望有一个全面的方法来给用户一个友好的错误信息,并且这可能表示您的程序错误处理某些内容,您可能需要弄清楚如何处理它正确。
有些情况下(例如OutOfMemoryException
),确实没有办法优雅地处理(除了退出),并且您应该让这些泡泡至少达到UI的优雅退出。
您应该捕获您期望的异常 - 并优雅地处理您不期待的异常(通过在通用异常处理程序中捕获它们)。
在你的榜样 - 创建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
}
只要抓住那些你可以和想要处理。
逻辑非常简单,你将如何处理剩下的“throw”?
除非你想要做的事情(逻辑\日志记录\错误信息),你只是要重新抛出然后你没有理由赶上。
http://stackoverflow.com/questions/1454266/net-catch-general-exceptions http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions –
就我个人而言,我最终使用'finally ''很多**比我使用过的更多'catch' –
@marc:这是我无法在几分钟前提出问题的原因吗? ;) –