![]() |
|
|
Java异常有很多问题需要处理。如是抛RuntimeException,还是抛CheckedException ? 异常处理能不能Reuse 等等。本文要探讨的是在Web领域俩个常见问题: 如何避免重复打印异常&如何友好的显示错误信息给终端用户。 由于Java EE 编程模型是N-Tier 结构,而很多模式,无论是设计模式,还是JavaEE模式,都倾向于分层,如下面一个列子,系统将用户数据通过WebService导出到另外一系统:
UserDataManager 作为一个Facade类,会通过userId获取User对象,然后依次调用WebServiceClient的login方法以及export方法,如下: UserDataManager.java
public void exportToSCRT(String userId) throws MyApplicationException { User user = null; UserDao userDao = new UserDao(); WebServiceClient client = WebServiceClient.instance(); try{ User user = userDao.getUser(userId) }catch(SomeDaoApplicationException ex{ ex.pirntStackTrace(); //........ throw new MyApplicationException(...) } try{ client.login(AppProp.getAdminId(),AppProp.getAdminPassword()); clinet.export(user) }catch(WebServiceApplicationException ex{ ex.pirntStackTrace(); //........ throw new MyApplicationException(...) } } public void login(id,password) { try{ String sessionId = soapBinding.login(id,password); soapBinding.setHeader(sessionId); }catch(SoapFault fault{ ex.pirntStackTrace(); //........ throw new MyApplicationException(...) } } public void export(User user) { soapBinding.export(user); } 我们已经看到了servlet和facade和WebServiceClient这三层,servlet负责处理web请求,并给予响应,它会调用Facade这一层,这层封装了多个业务调用,也许接下来还有更多的层去处理具体业务, 到此为止,我们已经发现同一个异常被多次打印。检查日志文件,你就能看到满屏重复的异常。 因此,异常只能被打印一次。在哪儿打异常最好呢?。原则就是自定义异常在抛出前打印一下,其他各层对自定义异常不作任何打印。甚至不用Catch. 对于上面WebServiceClient.login,在这打印是对的,还可以加上自己的一些log信息,如log.fatal("can not log in the XXX system");至于在其他层,就不在需要打印,处理这个异常了。这样的异常处理没有什么技术含量,只是个异常处理原则,如果人人都遵循(看到自定义不处理,抛自定义异常前处理)这个原则,就能避免重复打印异常日志 再考虑如何把友好的异常信息给终端用户呢,所谓友好,不能总是提示“系统错误,请稍后再试”,因为这样能让使用者对系统没有信心。好比领导交给你的任务,你没有完成,你总不能每次都说“这是我的问题,以后改正”吧。对异常进行稍微详细的说明,是必要的。另外,也不能总是把异常的stacktrace原封不动的现实给使用者,如java.io.IOExcepiton:File can not be found .这样会被认为你的程序质量不够高。 可以通过异常指定类型来在Web层解释并转化为友好的异常。如上列子,可以如下定义MyApplicationExceptoin public class MyApplicationExcepion extends Exception errorCode 指示了异常代码,如Web_Service_CanNot_Connect,Duplicate_Export_Error等等,Web层的Servlet可以通过分析errorCode来同一决定来决定输出何种友好信息。 如下代码:
上一篇:使用java实现http多线程下载 下一篇:JLDAP 连接池的创建及测试程序
|