当你为一些通用目的实现一个类时,为什么最好不要捕获异常?
我想这是错误可以上升到堆栈并帮助调试过程。还有其他原因吗?
答案 0 :(得分:10)
此规则应更好地阅读:不处理您不知道如何处理的例外情况!
如果是你编写一个读取CSV文件并返回该行标记的类,你的类中会有一些可能抛出IOException的点。你绝对不应该抓住它,因为处理它不是你的责任!您的任务是将字节流转换为令牌流,仅此而已。如果有人将腐败的流传递给你,这应由他处理,而不是你。
编辑:另一个例子:如果您的库例如遇到SocketException,并且套接字已从调用者提供给lib,则向上传递SocketException。如果您的库只是一个抽象连接框架,它也可以连接到文件,内存等,并且SocketExceptions不常见,将它们包装在ConnectionException中。
答案 1 :(得分:2)
它更面向对象并隐藏实现细节。
正如有效Java中的Joshua Bloch所说:
一种方法令人不安 抛出一个没有的异常 与任务的明显联系 它执行。这经常发生在 传播抛出的异常 通过较低级别的抽象。不只 这是令人不安的,但它污染了 更高层的API 实施细节。如果 实施更高层 随后发布的变化, 抛出的异常会改变 也可能破坏现有的 客户端程序。为了避免这种情况 问题,更高层应该抓住 较低级别的例外,在他们的 地方,抛出可能的例外 根据更高层次的解释 抽象。
答案 2 :(得分:1)
如果在捕获它们之后有一些有用的东西可以捕获异常。例如,假设您在尝试进行Web服务调用后获得IOException
。在某些情况下,捕获该异常并重试该呼叫可能是有意义的。
当你吞下它们而不适当地处理它们时,捕获异常变成了“坏事”。在这种情况下,你最好抛出异常,并从更高层次处理它,更明确的行为应该是什么。
答案 3 :(得分:1)
只有在有意义且可以对待的情况下才能捕获例外情况。 我们的想法是将异常传播到应用程序的层,以便用户或业务逻辑可以对异常采取某些行动。