我有一个我无法修改的API,基本上如下:
public void CatchException() {
try {
some code...
} catch (Throwable t) {
System.out.println(t.toString());
}
}
我在我的方法中调用此API:
public void myMethod() {
try {
someClass.CatchException();
} catch (Throwable t) {
... exception is not recaught
}
}
在对API的调用中,异常不会被第二次捕获,因为它在API方法中被使用...这是预期的Java行为......
我有没有办法检测到API方法中抛出异常而无法修改API代码?
答案 0 :(得分:1)
方法必须处理异常或不处理异常;但是,这与它是处理异常还是与某些异常相关的工作没有多大关系。
以下是一个知道异常的方法示例,但决定将它们委托给要处理的上层调用堆栈。
public void doSomething() throws Exception {
try {
some code...
} catch (Exception t) {
System.out.println(t.toString());
throw t;
}
}
public void doAndHandle() {
try {
doSomething();
} catch (Exception t) {
System.out.println(t.toString());
}
}
请注意,我可以在引发异常后执行处理(就像我在doSomething()
中那样,但是我不能抛出异常而不抛出异常。处理异常是一个有意识的决定,不抛弃它。异常可能无法完全处理它(如doSomething()
)
答案 1 :(得分:1)
通常,不会:您无法检测到您调用的代码中抛出了一些异常的事实,因为这会通过泄露API代码的实现细节而违反封装。
此规则的一个例外是,您可以检测由API调用的自己的代码抛出的异常,作为回调的一部分。在这种情况下,您可以使回调函数和API的调用者共享一个容器进行回调,并在那里记录异常。
另一个例外是API本身为您提供了查看异常的通道,例如,通过一些记录器框架记录它们。在这种情况下,您可以通过提供自己的" appender"来备份日志框架。实际上并没有附加任何内容,而是查找记录的异常,并将它们传回给您的代码。
答案 2 :(得分:0)
没有。通常期望方法将处理它遇到的任何异常,或者它将向调用方法抛出异常。
如果它既不处理方法也不抛出调用方法可以处理的异常,那么这表明API存在问题。因为现在它可能导致您的应用程序进入错误状态,并且无法检测到它。