第十二章 通过异常处理错误

来源:互联网 发布:淘宝旺铺基础版店招 编辑:程序博客网 时间:2024/05/21 07:12

终止与恢复:

终止模型、回复模型。程序员喜欢用“终止模型”处理

创建自定义异常:

必须从已有的异常类继承

对于异常,最重要的部分是类名

printStackTrace()

从方法调用处直到异常抛出处

打印ThrowableThrowable的调用栈轨迹

异常与日志记录:

使用java.util.logging工具将输出记录到日志中

Logger.getLogger()方法创建了一个String参数相关联的Logger对象

severe()Logger写入的最简单方式

StringWriter trace = new StringWriter();

printStackTrace(new PrintWriter(trace));

logger.severe(trace.toString());

异常说明:

属于方法声明的一部分,紧跟在形式参数列表之后

要么处理这个异常,要么就在异常说明中表示此方法将产生异常

throws关键字

捕获所有异常:

  1. Throwable fillInStackTrace()用于在Throwable对象的内部记录栈帧的当前状态,通过把当前栈的调用信息填入原来那个异常对象而建立的
  2. 显示throw之后try块内的代码无法到达,编写会报错

栈轨迹:

StackTraceElement[]getStackTrace()

提供编程访问由printStackTrace()输出的堆栈跟踪信息。返回堆栈跟踪元素的数组,每个元素表示一个堆栈帧。数组的第零个元素(假定数据的长度为非零)表示堆栈顶部,它是序列中最后的方法调用。通常,这是创建和抛出该throwable 的地方。数组的最后元素(假定数据的长度为非零)表示堆栈底部,它是序列中第一个方法调用。

重新抛出异常:

重新抛出异常会把异常抛给上一级的异常处理程序,同一个try块的后续catch子句将被忽略

有可能在捕获异常之后抛出另一种异常

异常链:

三种基本异常类提供了带有cause参数的构造器:ErrorExceptionRuntimeException

其他类型的异常链接起来,使用initCause()方法

Java标准异常:

Error用来表示编译时和系统错误

异常的基本的概念是用名称代表发生的问题

RuntimeException:

自动被Java虚拟机抛出

如果RuntimeException没有被捕获而直达main(),那么在程序退出前将调用异常的printStackTrace()方法

使用finally进行清理:

finally子句总能被执行

当要把除内存之外的资源恢复到它们的初始状态,就要用到finally子句

return中使用finally

finally类内部,从何处返回无关紧要,finally子句总是会执行

缺憾:异常丢失

异常的限制:

  1. 当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常
  2. 异常限制对构造器不起作用,派生类的构造器的异常说明必须包含基类构造器的异常说明
  3. 派生类构造器不能捕获基类构造器抛出的异常
  4. 派生类方法可以不抛出任何异常
  5. 不能基于异常说明来重载方法

构造器:

对于在构造阶段可能会抛出异常,并且要求清理的类,最安全的使用方式是使用嵌套的try子句

在创建需要清理的对象之后,立即进入一个try-finally语句块

异常匹配:

派生类的对象也可以匹配其基类的处理程序

其他可选方式:

只有在你知道如何处理的情况下才捕获异常

把异常传递给控制台:

main()传递给控制台

把“被检查的异常”转换为“不检查的异常”:

直接把“被检查的异常”包装进RuntimeException里面,还可以用getCause()捕获并处理特定异常

异常使用指南:

  1. 在恰当的级别处理问题
  2. 解决问题并重新调用产生异常的方法
  3. 进行少许修补,然后绕过异常发生的地方继续执行
  4. 用别的数据进行计算,以代替方法与记会返回的值
  5. 把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层
  6. 把当前运行环境下能做的事情尽量做完,然后把不同的异常抛到更高层
  7. 终止程序
  8. 进行简化
  9. 让类库和程序更安全

 

原创粉丝点击