我有一个看起来像这样的代码(抱歉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的相同问题。谢谢!
答案 0 :(得分:17)
try
中带有catch
的{{1}} / throw e;
完成了一件事:它会破坏堆栈跟踪信息。 可能 不是您想要的,因此应删除doSomethingRisky
/ try
- 它已按预期冒泡。< / p>
有关信息,如果它只是catch
(而不是throw;
)那么它只会是多余的,而不是破坏性的。
答案 1 :(得分:4)
它会以两种方式传递给来电者
您在上面显示的构造的一个用途是在过程中记录异常,但仍然将其抛出,以便调用堆栈的某个位置catch
可以处理异常。
要记住一件事,在这种情况下使用throw
而不是throw e
,以避免丢失堆栈跟踪信息。
答案 2 :(得分:2)
在你的情况下,这是多余的。开发人员通常会向异常添加更多信息,或者创建一个新异常,并将原始异常作为内部异常嵌入。但简单地捕捉和重新抛出是多余的。