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);
}
}