为什么应该尝试在检查异常上尝试不选中的例外



我被告知我应该考虑将在我的代码中删除 exception exception 用我自己的扩展了RuntimeException 。现在,我确实理解了两者之间的区别,但仍然不明白为什么要这样做?

如果我有此方法标头,则抛出2种异常:

public static Optional<String> getFileMd5(String filePath) throws NoSuchAlgorithmException, IOException {}

为什么我要用一个(不太详细的)例外替换它们?

ioexception是可以接受的。呼叫者无法确定该方法执行时仍然存在,并且仍然存在,并且您的方法必须能够向问题发出信号。IOException是在这种情况下进行的常规例外,尽管如果您更喜欢运行时异常,则可以将其包装在Un CheckeDioExection中。未检查的IO例外将与检查的IOException一样清晰。您会丢失的(或根据观点的不同)是您不会 force 来处理它。

另一方面,Nosuchalgorithmexception异常绝对应包裹在运行时例外。如果您的方法使用不存在的算法,呼叫者无需做任何事情。显然,如果发生这种例外,这显然是一个错误,并且应该通过运行时异常来发出错误。因此,写下自己的运行时间异常,以包装原始的nosuchalgorithmexception(这样就不会失去问题的根本原因),并且不要打扰代码的所有呼叫者,并且例外应该永远不会发生。

关于运行时与检查的例外,这主要是一个基于意见的问题,但是应该注意一些事情:

  • afaik,没有新的Java API使用了检查的异常。例如,请参见Java.Time,例如,尽管旧的等价(如dateformat)抛出了检查异常
  • ,但从未抛出检查例外情况
  • Java是唯一检查过例外的语言。
  • 检查的异常与Java 8中引入的功能惯用(Lambda表达式,流等)不太吻合:没有功能界面会引发检查的异常。

我认为现在可以肯定地说,检查例外是一个有趣的想法,但事实证明这是一个糟糕的想法。您应该更喜欢unchecekd例外。

现在,如果您的问题是:如何抛出未选中的异常而不是检查例外,这很简单:

public static Optional<String> getFileMd5(String filePath) {
    try {
        // your original code
    }
    catch (IOException e) {
        throw new UncheckedIOException(e);
    }
    catch (NoSuchAlgorithmException e) {
        throw MyCustomCryptoException(e);
    }
}

相关内容

  • 没有找到相关文章

最新更新