NutzCN Logo
问答 请问如何捕获全局异常
发布于 1306天前 作者 qq_fdcc91ff 1677 次浏览 复制 上一个帖子 下一个帖子
标签:

主要是想通过捕获不同的自定义异常来进行不同的业务处理

1 回复

参考
https://github.com/TomYule/NutzSite/blob/master/src/main/java/io/nutz/nutzsite/common/mvc/MyActionChainMaker.java

 /**
     * 该接口只有一个方法
     * @param config
     * @param ai
     * @return
     */
    @Override
    public ActionChain eval(NutConfig config, ActionInfo ai) {
        // 提醒: config可以获取ioc等信息, ai可以获取方法上的各种配置及方法本身
        // 正常处理的列表
        List<Processor> list = new ArrayList<>();
        // 设置base/msg等内置属性
        list.add(new UpdateRequestAttributesProcessor());

        list.add(new GlobalsSettingProcessor());
        // 设置编码信息@Encoding
        list.add(new EncodingProcessor());
        // 获取入口类的对象,从ioc或直接new
        list.add(new ModuleProcessor());
        //shiro
        list.add(new NutShiroProcessor());
        // SQL 注入过滤 XSS过滤
        list.add(new XssSqlFilterProcessor());
        // 处理@Filters
        list.add(new ActionFiltersProcessor());
        // 处理@Adaptor
        list.add(new AdaptorProcessor());
        //必填项做判断
        list.add(new ValidationProcessor());
        // 执行入口方法
        list.add(new MethodInvokeProcessor());
        // 对入口方法进行渲染@Ok
        list.add(new ViewProcessor());
        for (Processor p : list) {
            try {
                p.init(config, ai);
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

        // 最后是专门负责兜底的异常处理器,这个处理器可以认为是全局异常处理器,对应@Fail
        ErrorProcessor error = new ErrorProcessor();
        try {
            error.init(config, ai);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return new NutActionChain(list, error, ai);
    }
}
/**
 * 重写 Error信息处理类
 * @Author: Haimming
 * @Date: 2019-08-09 16:27
 * @Version 1.0
 */
public class ErrorProcessor extends ViewProcessor {

    private static final Log log = Logs.get();

    public static boolean isAjax(ServletRequest req) {
        String value = ((HttpServletRequest)req).getHeader("X-Requested-With");
        return value != null && "XMLHttpRequest".equalsIgnoreCase(value.trim());
    }
    @Override
    public void init(NutConfig config, ActionInfo ai) throws Throwable {
        view = evalView(config, ai, ai.getFailView());
    }

    @Override
    public void process(ActionContext ac) throws Throwable {
        if (log.isWarnEnabled()) {
            String uri = Mvcs.getRequestPath(ac.getRequest());
            log.warn(String.format("Error@%s :", uri), ac.getError());
        }
        String msg = "system.paramserror";
        if (ac.getError() instanceof ErrorException) {
            msg = ac.getError().getMessage();
        }
        if (ac.getError() instanceof RuntimeException ){
            Throwable error = Lang.unwrapThrow(ac.getError());
            if(error instanceof FailToCastObjectException){
                msg = Mvcs.getMessage(ac.getRequest(),"system.object.exception") + error.getMessage();
            }
            if(error instanceof NumberFormatException ){
                msg = Mvcs.getMessage(ac.getRequest(),"system.object.exception") + error.getMessage();
            }
        }
        //非AJAX 处理
        if (isAjax(ac.getRequest())) {
            NutShiro.rendAjaxResp(ac.getRequest(), ac.getResponse(), Result.error(msg));
        }else {
            new HttpStatusView(500).render(
                    ac.getRequest(),
                    ac.getResponse(),
                    Mvcs.getMessage(ac.getRequest(),
                            msg)
            );
        }
        super.process(ac);
    }
}

https://github.com/TomYule/NutzSite/blob/master/src/main/java/io/nutz/nutzsite/common/mvc/processor/ErrorProcessor.java

添加回复
请先登陆
回到顶部