我有method1(),它在整个代码中都从许多其他方法中调用。这是方法的签名:

 public void method1(final Properties properties) throws IOException {}


所有调用此方法的方法也会引发IOException。

method1()中的实际代码已更改,因此现在它代替IOException引发了其他一些扩展Exception而不是IOException的异常。

我不想更改所有调用method1()的方法的签名。

是否可以创建IOException并仍然从method1()引发IOException并因此调用method1()的方法?

如下所示:

 Try {
  // code
 } catch (Exception e) {
   throw new IOException(e.getCause());
 }

最佳答案

您需要将原始异常保存为原因,因此您不会丢失原始消息或堆栈跟踪。在代码示例中调用e.getCause()会跳过您捕获的异常,并找出其起因,这看起来很可疑。

另外,最好指定方法捕获的特定异常,而不是使用全部捕获的异常类型。捕获异常将导致像NullPointerExceptions这样的异常被捕获。

最好的做法是将方法抛出的异常更改为自定义类型,该类型不允许实现详细信息渗入调用方。您的方法签名应更改为

public void method1(final Properties properties) throws SomeCustomException {
    try {
        .... // do whatever
    } catch (AException | BException | CException e) {
        throw new SomeCustomException(e);
    }
}

10-07 19:06
查看更多