20150704 星期六 北京
Java程序提供三种可抛出结果,检查异常(checked Exception),运行时异常(RuntimeException),和错误(error).
那么什么情景下使用不同的异常呢?
使用checked Exception的原则是:如果期望调用者能够恰当地恢复(本身程序继续正常运行).
抛出checked Exception,强迫API调用者catch它或者继续抛出它.
未受检异常,就是Error和RuntimeException,在行为上两者等同,都是不需要进行catch的异常和错误.
为什么不需要处理呢?因为他们是不可恢复的,在继续进行下去没有任何意义.
运行时异常,表示API用户没有遵循API规范建立的约定,比如数组下标越界;或者异常情形可以忽略不做处理(个人工作经验)
错误,表示资源不足,约束失败,或者其他程序无法进行下去的条件,因此不要再实现新的Error子类.因此,你抛出的所有未检测异常都应该是RuntimException或者其子类.
如何自定义抛出结构呢?
此类应该是受检异常Exception的子类或者其本身.
对于需要恢复程序继续运行下去的异常,使用受检异常;
对于程序错误,违反API规范,或者无关紧要不需要处理,可以使用运行时异常;
情况并非如此分明,需要独自思考分析.
比如资源枯竭,可能因为程序设计的问题,那么使用受检异常;如果不是,那么使用运行时异常;如果不能确认什么原因,那么还是使用受检异常.
异常对象需要提供捕获异常代码的额外信息,特别是引发异常条件的信息.
受检异常通常指定可恢复的条件,所以提供辅助方法尤为重要.比如手机没话费了,呼叫失败,抛出受检异常,异常需要提供一个访问方法,允许客户查询所缺余额.