我之前有这样一个需求
如果我是ajax请求的话我如果后台报错我返回的是json格式的error
如果我不是ajax请求,是页面跳转submit的方式做提交,后台报错就按正常的跳转到500的报错界面
我的做法是写一个全局拦截器AjaxInterceptor代码如下
public class AjaxInterceptor implements Interceptor { protected static final Message ERROR_MESSAGE = Message.error("admin.message.error"); public boolean isAjax(Controller controller){ HttpServletRequest request = controller.getRequest(); String requestedWith = request.getHeader("x-requested-with"); if(StrKit.notBlank(requestedWith) && requestedWith.equals("XMLHttpRequest")){ return true; } return false; } public void intercept(Invocation ai) { try { ai.invoke(); } catch (Exception e) { e.printStackTrace(); if(isAjax(ai.getController())){ ai.getController().renderJson(ERROR_MESSAGE); }else{ ai.getController().renderError(500); } } } }
作用的如果检查请求头是ajax的我捕获到异常就返回json否则renderError 500
在jfinal3.1的时候我ai.invoke中如果有异常是正常执行的
我上周升级到3.2好像异常不会被我这个拦截器catch到,我怀疑是不是3.2改了action的机制提前把我的异常处理了所以我这边拦截不到了
这里我发现我对java异常处理的基础不好,如果是try catch嵌套的话,是不是最里面的try catch一旦捕获的异常是不会再传递给外层的try catch只会去依次执行外层的finally