首页 > 解决方案 > 如果存在允许正确处理的重载,catch(Exception) 是否适用于便捷方法?

问题描述

我正在开发一个用于处理文件的库,并希望使其易于使用(即不必担心异常),但也尽可能完整(即允许适当的异常处理)。

为了实现这一点,我公开了两种方法。一种允许正常捕获异常的方法:

public void saveChecked() throws IOException, IllegalArgumentException {
    // Possibly throw an IOException or IllegalArgumentException
}

...以及一个使用泛型处理所有异常的方法Consumer<Exception>

public void save(Consumer<Exception> handler) {
    try {
        saveChecked();
    } catch (Exception exception) {
        handler.accept(exception);
    }
}

这背后的意图是,如果您不需要区分异常并且只想在抛出异常时做一件简单的事情(例如打印堆栈跟踪,显示弹出窗口),您可以只使用第二个版本而不必写出一个 try-catch 块(并使单行不可能)。

即使 API 确实公开了一个允许对需要它的人进行适当异常处理的方法,这仍然是不好的做法吗?

标签: javaexceptionlibrary-design

解决方案


我正在开发一个用于处理文件的库,并希望使其易于使用(即不必担心异常),但也尽可能完整(即允许适当的异常处理)。

是爪哇。例外是语言的一部分。重新发明异常系统通常只会导致一个奇怪的库,它不适合 java 的其余部分。

抛出异常时做一件简单的事情(例如打印堆栈跟踪,显示弹出窗口)

psv main允许声明为throws Exception. 更一般地说,如果您想以相同的方式处理所有异常,请让异常一直冒泡到顶部,并注册一个异常处理程序,例如 via Thread.setDefaultUncaughtExceptionHandler

如果您只是讨厌检查的异常,那么您可能不应该使用 java。但是,如果您必须以某种方式违反规定,则始终可以抛出 UncheckedIOException,这使得整个“冒泡到顶部,注册未捕获的异常处理程序”变得更容易一些。

这仍然是不好的做法吗

是的。编写非惯用的 java 是不好的做法。


推荐阅读