异常处理在业界一直是一个头痛的问题。它本身的体系结构很简单,但是在我们的应用中设计一套合理的、最优的异常层次体系和相应的处理机制是非常困难的。困难来自于它的简单,来自于它的灵活。
在java中,异常分为检查型异常和非检查型异常。关于如何来使用这两种类型的异常,在业界有非常大的争论。
Sun传统的建议是在应用中通常应该使用检查型异常,应用它需要显示的捕获,也可以显示的文档化,除非你是java虚拟机,就用非检查型异常。
而现在很多大师级人物不是很赞同这种观点了,有些认为非检查型异常更有适用价值。更极端的看法是只使用非检查型异常。
在流行的spring框架中,设计大师在屏蔽数据库实现的异常处理机制中完全采用了非检查型异常。而在O/R映射框架hibernate,jdo、entity-ejb中使用了检查型异常。但是现在hibernate的主设计师认为hibernate其实更应该使用非检查型异常,在新版本中可能会作适当的改动。
也有的人认为2种类型的异常都需要,中庸的说,确实是这样。但是我们容易糊涂,特别是不太了解异常的新手。
非检查型异常不需要显示的捕获,除非显示的加上文档化标记,否则是不需要文档化的。这样的话,只查看文档,就有可能不会看到某些可能抛出的异常。
采用哪种方式比较好,目前没有定论。在我们目前编写的类中,采用了非检查型异常。
详细的类在com.catic.common.exception包中。
异常层次体系如下图:
我们所有的异常都是非检查型的异常。编程时可以不声明要抛出这些类型的异常,也可以不捕获这些类型的异常。但是我们要约定,在我们捕获到所有其他异常,都要转化为我们定义两种异常(ApplicationException,SysstemException)之一。这是一个强制性的约定。