异常处理是架构设计中的一个重要的部分。下面谈谈J2EE项目的中的异常处理。
在java里有3种异常类型:
1.检查型异常,这样的异常继承于Excetpion,就是在编译期间需要检查,如果该异常被throw,那么在该异常所在的method后必须显示的throws,调用该method的地方也必须捕获该异常,否则编译器会抛出异常.ejb里的RemoteException是一个这样的异常.
2.运行时异常,就是在运行期间系统出现的异常,该类异常继承于RuntimeException,该类异常在编译时系统不进行检查,如NullPointerExcetpion,NumberFormatException.
3.系统错误,一般是JVM出现异常时抛出的异常,如OutofMemoryError,这样的异常在J2EE开发中是不用关心的.
在J2EE开发中,检查型异常被滥用以至于过一段时间程序员自己都看不懂抛出这样的异常,.里面封装的这些错误信息是干什么用的,更可怕的是有好多有用的信息找不到了.比如SQLException和RemoteException这样的异常我们没必要再进行封装,这样的异常只对我们调试程序有用,而对客户来说它就是一个”系统错误”而已.异常处理有一个简单的原则,你什么时候需要封装自己的检查型异常?就是你很清楚自己抛出这个异常的用途时,比如用户输入用户名和密码要登录,但用户名和密码不匹配,你就要定义一个检查型异常,客户端通过捕获该异常,然后把相应的错误信息反馈给客户.而其它的自己未预期的错误或者异常比如SQLException,只需封装到EJBException中,ejb container会把它的信息追加到RemoteException里,这样客户端捕获RemoteException后把它写到系统日志里,就很容易进行调试.
关于错误代码,一般反馈给客户的错误代码有两种类型:
1.应用程序级错误,这些错误是由客户自身的原因引起的,比如输入信息有误,没有操作该功能的权限.对于这样情况,系统应给用户一个明确的提示.
2.系统级异常,比如”未连接到服务器”,”服务器忙”,”未连接到数据库”,”系统错误”,这样的错误给客户带来的后果是不能进行操作,那么下面的戏该由系统管理员和系统开发者去演了.
如上所述,因此,在异常处理时,凡需要给用户操作提示的信息统一用应用程序级错误来处理。开发一个应用程序级错误处理异常的超类,其它的异常处理继承该类,通过不同的异常的处理来显示不同的错误提示信息。
系统级异常的实现的方法非常简单,只要在web.xml文件中添加系统级错误的error-page的设置。
而对于应用级的异常,设计一个应用异常超类ApplicationException.其余异常都可以继承该异常。
需要在应该捕获异常的时候,进行捕获。
在ManagedBean中,通过调用FacesContex来将异常消息传送到页面上。
例子如下: