有效处理 Java 异常三原则
java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。
异常之所以是一种强大的调试手段,在于其回答了以下三个问题:
- 什么出了错?
- 在哪出的错?
- 为什么出错?
在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们。
有三个原则可以帮助你在调试过程中最大限度地使用好异常,这三个原则是:
- 具体明确
- 提早抛出
- 延迟捕获
为了阐述有效异常处理的这三个原则,本文通过杜撰个人财务管理器类JCheckbook进行讨论,JCheckbook用于记录及追踪诸如存取款,票据开具之类的银行账户活动。
具体明确
Java定义了一个异常类的层次结构,其以Throwable开始,扩展出Error和Exception,而Exception又扩展出RuntimeException.如图1所示.
图1.Java异常层次结构
这四个类是泛化的,并不提供多少出错信息,虽然实例化这几个类是语法上合法的(如:new Throwable()),但是最好还是把它们当虚基类看,使用它们更加特化的子类。Java已经提供了大量异常子类,如需更加具体,你也可以定义自己的异常类。
例如:http://java.io package包中定义了Exception类的子类IOException,更加特确的是FileNotFoundException,EOFException和ObjectStreamException这些IOException的子类。
每一种都描述了一类特定的I/O错误:分别是文件丢失,异常文件结尾和错误的序列化对象流。异常越具体,我们的程序就能更好地回答”什么出了错”这个问题。
捕获异常时尽量明确也很重要。
例如:JCheckbook可以通过重新询问用户文件名来处理FileNotFoundException,对于 EOFException,它可以根据异常抛出前读取的信息继续运行。
如果抛出的是ObjectStreamException,则程序应该提示用户文件已损坏,应当使用备份文件或者其他文件。
Java让明确捕获异常变得容易,因为我们可以对同一try块定义多个catch块,从而对每种异常分别进行恰当的处理。