C#throw语句多余?

时间:2013-06-21 12:23:44

标签: c# java exception-handling

我有一个看起来像这样的代码(抱歉Java括号样式):

class SomeClass {
   public static void doSomethingRisky() {
        try {
          SomeRiskyFunction();
        } catch (Exception e) {
          throw e;
        }
   }
}

class MainClass {
   public void callSomethingRisky() {
        try {
          SomeClass.doSomethingRisky();
        } catch (Exception e) {
          FinallyHandleTheException(e);
        }
   }
}

基本上,SomeClass将是一个库,我想设计它,以便所有异常将由调用程序处理(可能会也可能不会选择显示有关异常的消息)。

我的问题是try/catch&throw来自doSomethingRisky()的{​​{1}}。这是多余的还是有必要的?我的意思是,如果我将其关闭并且该函数在运行时遇到异常,它是否会使程序崩溃,因为没有捕获THAT函数内部的异常,或者它是否仍然将它传递给调用者(SomeClass)优雅地处理?

Java的相同问题。谢谢!

3 个答案:

答案 0 :(得分:17)

try中带有catch的{​​{1}} / throw e;完成了一件事:它会破坏堆栈跟踪信息。 可能 不是您想要的,因此应删除doSomethingRisky / try - 它已按预期冒泡。< / p>

有关信息,如果它只是catch(而不是throw;)那么它只会是多余的,而不是破坏性的。

答案 1 :(得分:4)

它会以两种方式传递给来电者 您在上面显示的构造的一个用途是在过程中记录异常,但仍然将其抛出,以便调用堆栈的某个位置catch可以处理异常。

要记住一件事,在这种情况下使用throw而不是throw e,以避免丢失堆栈跟踪信息。

答案 2 :(得分:2)

在你的情况下,这是多余的。开发人员通常会向异常添加更多信息,或者创建一个新异常,并将原始异常作为内部异常嵌入。但简单地捕捉和重新抛出是多余的。