14

这不是“如何捕获所有异常”,而是“您应该捕获所有异常”吗?在 C# .NET 中,我注意到大量异常。是否建议计划捕获每个异常?

例如DirectoryInfo()构造函数抛出 4 个异常。我应该计划捕捉这些还是只捕捉我可以处理的那些?也许让其他人冒泡到Main()我有一个包罗万象的地方,然后告诉用户有一个未捕获的异常。似乎在所有这些可能的异常情况下,您的代码可能比实际代码更具异常处理能力。

4

4 回答 4

19

只捕获那些对于您编写代码的抽象级别有意义的处理。大多数异常只会在比它们被抛出的地方更高的级别被捕获。

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

于 2012-06-25T14:31:09.057 回答
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
}
于 2012-06-25T14:34:45.433 回答
0

通常,您应该只捕获您知道如何处理的异常。异常冒泡的目的是让代码的其他部分在可以处理它们的情况下捕获它们,因此在一个级别捕获所有异常可能不会让您获得想要的结果。

在顶层,您可能希望有一个包罗万象的功能,以便给用户一个友好的错误消息,这表明您的程序正在错误处理某些东西,您可能需要弄清楚如何正确处理它。

在某些情况下(例如OutOfMemoryException),确实没有办法优雅地处理(除了退出),您绝对应该让它们冒泡至少直到 UI 才能优雅地退出。

于 2012-06-25T14:34:02.050 回答
0

只要抓住那些你能和想要处理的。
逻辑很简单,你将如何处理其余的“投掷”?
除非你想做一些事情(逻辑\日志\错误消息)并且你只是要重新抛出然后你没有理由抓住。

于 2012-06-25T14:40:53.333 回答