异常捕获问题

Controller的代码如下:

public void index() throws Exception{
		render("auth_sign_list1.html"); // 此html不存在
	}

由于不存在此html,所有抛出 java.lang.RuntimeException: File not found 异常。

但是在JfinalConfig中已经配置了异常拦截器:

@Override
	public void configInterceptor(Interceptors me) {
		me.add(new ExceptionInterceptor("/common/500.html"));
	}

此拦截器的实现如下:

 @Override
    public void intercept(Invocation ai) {
        try {
            ai.invoke();
        } catch (Exception e) {
        	logger.error(e.getMessage(),e);
        	Controller controller = ai.getController();
        	if (RequestKit.isAjaxRequest(controller.getRequest())) {
				controller.renderJson(Ret.fail("msg","程序内部错误!"));
			}else {
				controller.setAttr("msg", e.getMessage());
	        	controller.render(this.render);
			}
        }
    }

但是此异常不会被拦截到?Jfinal中的异常不经过拦截器,是需要在

web.xml 中配置 500 的错误,是吗?如果在web.xml中配置500错误拦截的话,那是不是拦截到的 500.html 无法进行模板引擎操作了

评论区

JFinal

2019-01-04 17:09

render("auth_sign_list1.html") 这行代码只会创建一个 new TemplateRender(...) 对象而已,如果有异常是在 TemplateRender.render() 中抛出来的

所以这个问题需要通过继承 RenderFactory,并覆盖里头的 getErrorRender(...) 方法去解决,在 getErrorRender 中可以响应自定义的 render ,实现精细化控制

还可以通过配置来解决:
configConstant(Constants me) {
me.setError500View("/common/500.html");
me.setErrorView(404, "/common/404.html");
}