Java 为什么最好不要在通用类中捕获异常?

Java 为什么最好不要在通用类中捕获异常?,java,exception-handling,Java,Exception Handling,当您实现一个类用于某种通用用途时,为什么最好不捕获异常 我想是这样的,错误可以上升到堆栈中,并在调试过程中提供帮助。还有其他原因吗?它更面向对象,并且隐藏了实现细节 正如Joshua Bloch在《有效Java》中所说: 当一个方法 抛出一个没有 与完成的任务有明显的联系 它执行。这通常发生在 方法传播引发的异常 通过较低级别的抽象。不仅 这令人不安,但会造成污染吗 上层的API使用 实施细节。如果 更高层的实现 后续版本中的更改 它抛出的异常将改变 也可能破坏现有的 客户端程序。为了避免这种情

当您实现一个类用于某种通用用途时,为什么最好不捕获异常


我想是这样的,错误可以上升到堆栈中,并在调试过程中提供帮助。还有其他原因吗?

它更面向对象,并且隐藏了实现细节

正如Joshua Bloch在《有效Java》中所说:

当一个方法 抛出一个没有 与完成的任务有明显的联系 它执行。这通常发生在 方法传播引发的异常 通过较低级别的抽象。不仅 这令人不安,但会造成污染吗 上层的API使用 实施细节。如果 更高层的实现 后续版本中的更改 它抛出的异常将改变 也可能破坏现有的 客户端程序。为了避免这种情况 问题是,更高的层次应该抓住这个问题 较低级别的异常,以及 放置,抛出可以 从更高层次的角度解释 抽象


这条规则最好是这样的:不要处理你不知道如何处理的异常

例如,如果您编写了一个读取CSV文件并返回该行标记的类,那么您的类中可能会有一些点抛出IOException。你绝对不应该抓住它,因为处理它不是你的责任!您的任务是将字节流转换为令牌流,仅此而已。如果有人向你传递了一条腐败的信息流,这应该由他来处理,而不是你


编辑:另一个示例:例如,如果您的库达到SocketException,并且调用方已将套接字提供给该库,则向上传递SocketException。如果您的库只是一个抽象连接框架,它还可以连接到文件、内存等,并且SocketException并不常见,请将它们包装在ConnectionException中

如果捕获异常后有一些有用的事情要做,那么捕获异常是可以的。例如,假设您在尝试进行web服务调用后得到一个
IOException
。在某些情况下,捕获该异常并重试调用可能是有意义的

当您不适当地处理异常而吞下它们时,捕获异常将成为一件“坏事”。在这种情况下,最好是抛出异常,并从更高的级别处理它,在更高的级别上,行为应该是什么。

只有在有意义且可以处理的情况下才能捕获异常。
我们的想法是将异常传播到应用程序的各个层,使用户或业务逻辑可以对异常采取一些行动。

Bloch不是说“不要抛出异常”,而是说“抛出适合于抽象的异常”。@Software Monkey:+1,你是对的,读了一秒钟,我只是举了一个例子来说明他的说法。