java - 如果存在允许正确处理的重载,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 确实公开了一个允许对需要它的人进行适当异常处理的方法,这仍然是不好的做法吗?
解决方案
我正在开发一个用于处理文件的库,并希望使其易于使用(即不必担心异常),但也尽可能完整(即允许适当的异常处理)。
是爪哇。例外是语言的一部分。重新发明异常系统通常只会导致一个奇怪的库,它不适合 java 的其余部分。
抛出异常时做一件简单的事情(例如打印堆栈跟踪,显示弹出窗口)
psv main
允许声明为throws Exception
. 更一般地说,如果您想以相同的方式处理所有异常,请让异常一直冒泡到顶部,并注册一个异常处理程序,例如 via Thread.setDefaultUncaughtExceptionHandler
。
如果您只是讨厌检查的异常,那么您可能不应该使用 java。但是,如果您必须以某种方式违反规定,则始终可以抛出 UncheckedIOException,这使得整个“冒泡到顶部,注册未捕获的异常处理程序”变得更容易一些。
这仍然是不好的做法吗
是的。编写非惯用的 java 是不好的做法。
推荐阅读
- r - causal_forest 命令要求提供向量
- python - 如何在 Django 中添加额外的列 mysql 数据库表?
- python - 有没有办法将 selenium 与 chrome 而不是 chromedriver 一起使用?
- mysql - 只是将新数据从 Cloud SQL 导入 BigQuery?
- python - 为什么 pandas 数据框变成了 NoneType 对象?
- azure - 参考 Azure DevOps 上的 MS Access Engine 进行集成测试
- elixir - Elixir Flow 在本地机器上工作,但不处理数据并抛出:[warn] ** Undefined handle_info in "GenStage.Streamer" in AWS Fargate
- c# - 如何在 Unity 中根据混音器的音量设置滑块的音量?
- python-3.x - 用另一个列表拆分一个列表
- karate - 空手道:如何从空手道框架的特征中生成的 URL 中提取变量