异常处理
<h1><center>异常处理</center></h1>
<p>通常一个web框架中,有大量需要处理的异常。比如业务异常,权限不足等等。前端通过弹出提示信息的方式告诉用户出了什么错误。 通常情况下我们用try.....catch.... 对异常进行捕捉处理,但是在实际项目中对业务模块进行异常捕捉,会造成代码重复和繁杂, 我们希望代码中只有业务相关的操作,所有的异常我们单独设立一个类来处理它。全局异常就是对框架所有异常进行统一管理。 我们在可能发生异常的方法里throw抛给控制器。然后由全局异常处理器对异常进行统一处理。 如此,我们的Controller中的方法就可以很简洁了。
动作链 配置 在如下配置自定义 mvc的环节
io.nutz.nutzsite.common.mvc.MyActionChainMaker.java
异常处理定义统一处理类</p>
<pre><code class="language-java">package io.nutz.nutzsite.common.mvc.processor;
/**
* 重写 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);
}
}</code></pre>