即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

第9章 异常

编程语言 jslcylcy 14℃ 0评论

57.只针对异常的情况才使用异常


异常只用于异常的情况,永远不能用于正常的流程控制


设计良好的 api 不应该强迫它的客户端为了正常的控制流使用异常


如果类有特定的状态相关的方法,则类应该提供状态测试关联的方法,例如 iterator 中的方法 next()与 hasNext(),而不是在遍历时使用数组越界异常

58.对可恢复的情况使用受检异常,对编程错误使用运行时异常


java 中有三种可抛出结构:受检异常,运行时异常和 error


如果期望调用者能够适当的恢复,使用受检异常,强迫调用者在 catch中处理该异常,或者将它传播出去


有两种未受检的可抛出结构:运行时异常与错误,这两者在行为上相同,它们不会也不应该被捕获

59.必满不必要的使用受检异常


优先使用状态检查代替抛出异常,但如果状态检查,必须重复方法,此时可以使用抛出异常

60.优先使用标准的异常


常用异常:


IllegalArgumentException(非法参数) IllegalStateException(状态异常) NullPointerException(空指针) IndexOutOfBoundsException(数组越界)


ConcurrentModificationException (用在禁止多线程修改对象的地方)


UnsupportedOperationException(对象不支持所请求的操作,一般用作某些接口的实现类不支持某些方法)

61.抛出与抽象相对应的异常


更高层的实现应该捕获顶层的异常,同时抛出可以按照高层抽象进行解释的异常,这种方式被称为异常转译


异常链:可以将底层异常经过包装,传递到高层异常

62.每个方法抛出的异常都要有文档


始终单独的声明受检异常,并用@throw 标记,准确记录下抛出每个异常的条件,


永远不要声明方法 throws Exception 或者 throws Throwable


不要将未受检的异常包含在方法声明中


如果一个类中许多方法出于同样的原因而抛出同一个异常,在该类的文档注释中对这个异常建立文档,是可以接受的,而不是为每个方法建立文档

63.在细节消息中包含能捕获失败的信息


为了捕获失败,异常信息应该包含所有对该异常有贡献的参数和域的值,例如 IndexOutOfBoundsException应当包含 上界,下界以及没有落在界内的下标值


异常的细节消息不应该与用户层次的错误消息混为一谈


为了确保异常的细节消息包含足够信息,可以在异常构造器而不是字符串细节消息中引入这些信息

64.努力使失败保持原子性


在执行操作之前检查参数的有效性


调整计算处理过程,使得任何可能会失败的计算部分都在对象状态被修改之前发生


最后的方法时编写一段恢复代码来保证原子性


还有一种方法是在对象的临时拷贝上执行操作,操作完成后将临时拷贝的内容替换原有对象

65.不要忽略异常


catch 块中至少包含说明,解释为何可以忽略异常

转载请注明:CodingBlog » 第9章 异常

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情