![](/img/trans.png)
[英]Why throw RuntimeException Error instead of IOException Message?
[英]Throw IOException instead of Exception
我有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());
}
不 ,您不应该这样做,因为您会混淆其他所有阅读代码或阅读堆栈跟踪信息的开发人员。
从软件设计的角度来看,该错误发生的时间要早得多。 如果您的代码就像API并被其他人使用,则最好使用Custom-Exceptions并将IOException包装为根本原因。
如果您具有完整的源,则应重构源并添加另一个异常签名。
您需要将原始异常保存为原因,因此您不会丢失原始消息或堆栈跟踪。 在代码示例中调用e.getCause()
会跳过您捕获的异常并获取其起因,这看起来很可疑。
另外,最好指定该方法捕获的特定异常,而不是使用全部捕获的Exception类型。 捕获异常会导致像以前捕获的NullPointerExceptions一样被捕获。
最好的做法是将方法抛出的异常更改为自定义类型,该类型不允许实现详细信息渗入调用方。 您的方法签名应更改为
public void method1(final Properties properties) throws SomeCustomException {
try {
.... // do whatever
} catch (AException | BException | CException e) {
throw new SomeCustomException(e);
}
}
这将在技术上起作用。
但是,捕获Exception
或Throwable
几乎总是一个坏主意(就像抛出它们一样),因为除了RuntimeExceptions
之外,您还将捕获所有其他Exception。
如果您可以更改所有调用类的代码(即,您不开发框架/库),则应该这样做。 因为我假设您的意思是method1()
现在引发一个更特定的类型。
您可能还会考虑抛出一个RuntimeException
的子类型,该子类型不需要捕获,对于无法纠正的错误(例如,错误的配置)是个好主意。 (请参阅罗伯特·马丁的清洁代码 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.