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

Java 如果存在允许正确处理的重载,则catch(Exception)对于便利方法是否可行?,java,exception,library-design,Java,Exception,Library Design,我正在开发一个用于处理文件的库,希望使其尽可能易于使用(即不必担心异常),但也尽可能完整(即允许适当的异常处理) 为了实现这一点,我公开了两种方法。一种允许正常捕获异常的方法: public void saveChecked() throws IOException, IllegalArgumentException { // Possibly throw an IOException or IllegalArgumentException } …以及使用通用使用者处理所有异常的程序:

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

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

public void saveChecked() throws IOException, IllegalArgumentException {
    // Possibly throw an IOException or IllegalArgumentException
}
…以及使用通用
使用者处理所有异常的程序:

公共作废保存(使用者处理程序){
试一试{
saveChecked();
}捕获(异常){
handler.accept(异常);
}
}
这样做的目的是,如果您不需要区分异常,只想在抛出异常时做一件简单的事情(例如打印堆栈跟踪,显示弹出窗口),那么您可以使用第二个版本,而不必编写try-catch块(并使一行代码不可能)

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

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

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

抛出异常时执行一件简单的操作(例如打印堆栈跟踪,显示弹出窗口)

psv main
允许声明为
抛出异常
。更一般地说,如果希望以相同的方式处理所有异常,请让异常一直冒泡到顶部,并注册异常处理程序,例如通过
Thread.setDefaultUncaughtExceptionHandler

如果您只是讨厌检查异常,那么您可能不应该使用java。然而,如果你不得不违背规则,你总是可以抛出一些未选中的异常,这使得整个“气泡上升到顶部,注册一个未捕获的异常处理程序”变得容易一些

这仍然是坏习惯吗


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

让API抛出低级异常(
IOException
IllegalArgumentException
)有点难闻。也许可以创建一个自定义异常(从
RuntimeException
扩展),以包装所有低级异常。API不必声明任何异常。在内部,默认错误处理程序只能抛出自定义异常,但如果需要,用户可以使用回调覆盖默认错误处理程序。实际上,我有一个基本的
RutimeException
类,我在幕后抛出的大多数异常都是从该类继承的,但是包装其他异常正是我之前所做的,我正试图避免这样做,因为它剥夺了使用try-catch处理不同异常的能力。我也看到默认处理程序存在同样的问题,因为它不可能处理所有可能抛出的异常,而且处理它们的方式可能因文件而异。@AndrewS,这完全是胡说八道。一个固有的I/O相关的方法(例如,它被称为“saveToFile”,或者通过其名称或文档被指定为固有地涉及某种I/O)当然可以
抛出IOException
。java.lang中的运行时异常用于一般目的。例如,github上每一个排名前50位的库都会抛出它们。。。这意味着你在错误的网站上…好论点<代码>导致了一个奇怪的库,它不适合java的其他部分
我可以看出,这是一个很好的观点。谢谢你的建议!
public void save(Consumer<Exception> handler) {
    try {
        saveChecked();
    } catch (Exception exception) {
        handler.accept(exception);
    }
}