需要注意的是:在使用instanceof判断异常类型的时候一定要从子到父依次找,比如BaseException继承与RuntimeException,则必须首先判断是否是BaseException再判断是否是RuntimeException。
最后在error JSP页面显示具体的错误消息即可:
<body> <s:if test="%{#request.errorMsg==null}"> <p>对不起,系统发生了未知的错误</p> </s:if> <s:else> <p>${requestScope.errorMsg}</p> </s:else> </body> |
以上方式可以拦截后台代码所有的异常,但如果出现数据库连接异常时不能被捕获的,大家可以使用struts2的全局异常处理机制来处理:
<global-results> <result name="error" >/Web/common/page/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping> </global-exception-mappings> |
上面这是一个很简单的异常拦截器,大家可以使用自定义异常,那样会更灵活一些。
以上异常拦截器可以使用其它很多技术替换:比如spring aop,servlet filter等,根据项目实际情况处理。
【补充】ajax也可以进行拦截,但是因为ajax属于异步操作,action通过response形式直接把数据返回给ajax回调函数,如果发生异常,ajax是不会执行页面跳转的,所以必须把错误信息返回给回调函数,我针对json数据的ajax是这样做的:
/** * 读取文件,获取对应错误消息 */ HttpServletResponse response = (HttpServletResponse)actioninvocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE); response.setCharacterEncoding(Constants.ENCODING_UTF8); /** * 发送错误消息到页面 */ PrintWriter out; try { out = response.getWriter(); Message msg = new Message(errorMsg); //把异常信息转换成json格式返回给前台 out.print(JSONObject.fromObject(msg).toString()); } catch (IOException e1) { throw e; } |
以上是个人拙见,勿拍砖,谢谢。