我有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);
}
}