繁体   English   中英

引发IOException而不是Exception

[英]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);
    }
}

这将在技术上起作用。

但是,捕获ExceptionThrowable几乎总是一个坏主意(就像抛出它们一样),因为除了RuntimeExceptions之外,您还将捕获所有其他Exception。

如果您可以更改所有调用类的代码(即,您不开发框架/库),则应该这样做。 因为我假设您的意思是method1()现在引发一个更特定的类型。

您可能还会考虑抛出一个RuntimeException的子类型,该子类型不需要捕获,对于无法纠正的错误(例如,错误的配置)是个好主意。 (请参阅罗伯特·马丁的清洁代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM