在Java中,有没有办法重新捕获或列出以前捕获的异常

时间:2015-09-11 21:07:25

标签: java exception-handling

我有一个我无法修改的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代码?

3 个答案:

答案 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存在问题。因为现在它可能导致您的应用程序进入错误状态,并且无法检测到它。