如果存在允许正确处理的重载,那么 catch(Exception) 对于便捷方法是否可行?

Is catch(Exception) viable for convenience methods if there is an overload that allows proper handling?

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

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

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 确实公开了一种允许为需要它的人进行适当异常处理的方法,这仍然是不好的做法吗?

I am developing a library for working with files and want to make it as easy to use (i.e. not having to worry about exceptions), but also as complete as possible (i.e. allow for proper exception handling).

是java。异常是语言的一部分。重新发明异常系统主要只会导致一个不适合 java.

其余部分的奇怪库

do one simple thing when an exception is thrown (e.g. print the stack trace, show a popup)

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

如果您只是讨厌 检查异常,您可能不应该使用java。但是,如果您必须以某种方式违背规律,总有 UncheckedIOException 可以抛出,这使得整个 'bubble up to the top, register an uncaught exception handler' 更容易一些。

Is this still bad practice

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