第七章 异常、断言和日志

处理错误

  • 由于出现错误而使某些操作没有完成,程序应该:返回到一种安全状态,并能够让用户执行一些其他的命令,或者允许用户保存所有操作的结果,并以妥善的方式终止程序。
  • 异常对象都是派生于Throwable类的一个实例
  • Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的错误。
  • Exception层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException,如错误的类型转换,数组访问越界,访问null指针;而程序本身没有问题,但由于像IO错误这类问题导致的错误属于其他异常。
  • 如果出现RuntimeException异常,那么一定是你的问题。
  • Java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查异常unchecked,所有其他的异常称为受查异常。编译器将核查是否为所有的受查异常提供了异常处理器
  • 对于那些可能被他人使用的Java方法,应该根据异常规范Exception specification,在方法的首部声明这个方法可能抛出的异常。
  • 捕获异常:如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么1.程序将跳过try语句块的其余代码2.程序将执行catch子句中的处理器代码。
  • 能处理的异常用try/catch,不能处理的异常throws抛出给调用者
  • 使用getMessage()可以得到异常对象的信息,getClass().getName()可以得到异常对象的实际类型
  • 在一个try语句中可以捕获多个异常类型,并对不同类型的异常做出不同的处理。同一个catch子句中可以捕获多个异常类型(使用| 分隔,只有在当捕获的异常类型彼此之间不存在子类关系时才需要这个特性)
  • 可以在catch子句中再次抛出异常 throw new ...Exception(...);
  • 不管是否有异常被捕获,finally子句中的代码都被执行
  • try语句可以只有finally语句,而没有catch语句
  • 建议强烈耦合try/catch和try/finally语句
  • 带资源的try语句(try-with-resources)

使用异常机制的技巧

  • 异常处理不能代替简单的测试;使用异常的基本规则是:只在异常情况下使用异常机制。
  • 不要过分地细化异常
  • 利用异常层次结构
  • 不要压制异常
  • 在检测错误时,“苛刻”要比放任更好
  • 不要羞于传递异常(早抛出,晚捕获)

使用断言

  • assert 条件:和assert 条件:表达式;都会对条件进行检测,如果结果为false,则抛出一个AssertionError异常。第二种形式中,表达式将传入AssertionError的构造器,并转换成一个消息字符串
  • 使用断言的情况:断言失败是致命的,不可恢复的错误;断言检查只用于开发和测试阶段。
  • 断言是一种测试和调试阶段所使用的战术性工具。

记录日志

  • 日志记录是一种在程序的整个生命周期都可以使用的策略性工具。
  • 日志记录API的优点

调试技巧

你可能感兴趣的:(第七章 异常、断言和日志)