为什么最好不捕获通用类中的异常?

时间:2011-03-12 19:00:51

标签: java exception-handling

当你为一些通用目的实现一个类时,为什么最好不要捕获异常?

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

4 个答案:

答案 0 :(得分:10)

此规则应更好地阅读:不处理您不知道如何处理的例外情况!

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

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

答案 1 :(得分:2)

它更面向对象并隐藏实现细节。

正如有效Java中的Joshua Bloch所说:

  

一种方法令人不安   抛出一个没有的异常   与任务的明显联系   它执行。这经常发生在   传播抛出的异常   通过较低级别的抽象。不只   这是令人不安的,但它污染了   更高层的API   实施细节。如果   实施更高层   随后发布的变化,   抛出的异常会改变   也可能破坏现有的   客户端程序。为了避免这种情况   问题,更高层应该抓住   较低级别的例外,在他们的   地方,抛出可能的例外   根据更高层次的解释   抽象。

答案 2 :(得分:1)

如果在捕获它们之后有一些有用的东西可以捕获异常。例如,假设您在尝试进行Web服务调用后获得IOException。在某些情况下,捕获该异常并重试该呼叫可能是有意义的。

当你吞下它们而不适当地处理它们时,捕获异常变成了“坏事”。在这种情况下,你最好抛出异常,并从更高层次处理它,更明确的行为应该是什么。

答案 3 :(得分:1)

"Throw early catch late!"

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

相关问题