2011-07-09 67 views
6

在多个方法之间抛出异常时,是否所有方法都会抛出异常?例如C#抛出异常

Method1() 
{ 
    Method2(); 
} 

Method2() 
{ 
    try 
    { 
     // Do something 
    } 
    catch 
    { 
     throw; 
    } 
} 

try 
{ 
    Method1(); 
} 
catch 
{ 
    // Do something about exception that was thrown from Method2() 
} 

请注意,在Method1(),我并不需要在try块包裹Method2(),我应该是什么?

回答

8

您不需要尝试,捕捉并重新抛出异常,除非您有一些特殊的原因来捕捉它们。否则,他们会自动将从较低级别的函数中冒出来,这些函数会将它们引导至代码中的最高级别函数。从本质上讲,你可以把它们想象成一直在“重新安排”,即使这在技术上并不是所发生的。

事实上,大部分时间你看到一个try/catch区块被写入,这是不正确的。 除非您真的可以处理它们,否则不应该发现异常。这是完全没有意义的(事实上被认为是不好的做法)只是为了重新抛出异常而捕捉异常。请勿将所有代码都包含在try区块中。

注意的是,“处理它们”,我的意思是你在catch块码将基于抛出的特定异常试图正确异常情况的一些具体行动。
例如,对于FileNotFoundException,您可能会通知用户该文件找不到,并要求他们选择另一个文件。

请参阅my answer here了解更多详情并详细讨论“异常处理最佳实践”。

9

您不需要将所有内容都包装在try区块中。

您应该只有当你想catch东西,你应该只catch东西在下列情况下try

  • 你准备手柄异常(做任何需要做的事情和别让它传播了堆栈),
  • 你想重新抛出之前,做一些不同之处(如日志吧)(通过使用throw的参数的形式),
  • 您要添加DETA通过将它包裹在你自己的另一个例外中,这是例外(见下面的Allon Guralnek的出色评论)。
+3

+1:简洁准确。我会添加一个不完全“重新抛出”的原因 - 在不同的异常中包装异常(但始终将原始异常保留在InnerException中,否则会丢失有助于调试的原始异常的信息)。包装可能会导致重新投掷不能的其他背景,例如“无法保存客户843的新订单,请参阅InnerException获取详细信息。” –