版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linzhaoliangyan/article/details/88813062
异常类型
* 运行时异常
不可预期的异常
比如:一些业务 需要运算 (分母变成0)。开发规范要求,测试充分避免异常,假如出现打印堆栈或记录日志。
* 预期的异常(编译异常和自定义异常)
比如IO流处理时 预期会发生IO异常。
* 业务规则中的异常:比如:转班不成功,提示转班不成功
* 我们已经在业务中用AOP进行统一的处理
* springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
* springmvc中有全局异常处理器,做统一的处理。
* 异常传统处理思路
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理
* 我们项目架构的处理异常的方案
传统异常:
1.如果是预期的异常:自定义异常类来存放预期的异常信息。(转班失败)
2 需要在类中做业务相关的处理
* 每个业务类进行try{}catch(HxException ){
throw new HxException("某某业务处理失败");
}
我们处理异常
* 利用切面统一处理处理业务的异常
package com.hx.ssm.exception;
/**
* @author xiaozhao
*/
public class HxException extends Exception {
/**
* 存放异常的信息
*/
private String exceptionMessage;
`
public String getExceptionMessage() {
return exceptionMessage;
}
public void setExceptionMessage(String exceptionMessage) {
this.exceptionMessage = exceptionMessage;
}
}
package com.hx.ssm.exception;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* @author xiaozhao
*/
public class HxExceptionResovler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
String exMessage = null;
HxException hxEx = null;
ModelAndView mv = new ModelAndView();
if (ex instanceof HxException) {
// 判断下 异常是否是 预期时的异常
// 如果是:就直接根据业务来响应
hxEx = (HxException) ex;
mv.addObject("message", hxEx.getExceptionMessage());
} else {
// 如果不是: 捕获异常信息 ,写日志
StringWriter s = new StringWriter();
PrintWriter printWriter = new PrintWriter(s);
ex.printStackTrace(printWriter);
exMessage = s.toString();
// 写日志
}
// 返回一个页面
mv.setViewName("error");
return mv;
}
}
* 在SpringMVC里面配置
<bean class="com.hx.ssm.exception.HxExceptionResovler"></bean>
* 处理错误的业务
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<img width="85%" height="85%" src="${pageContext.request.contextPath}/images/error.png">
</body>
</html>
* DataVoAndTransactionAspect
catch (Throwable throwable) {
// 打印到控制台
// throwable.printStackTrace();
//记录到日志中
StringWriter s = new StringWriter();
PrintWriter printWriter = new PrintWriter(s);
throwable.printStackTrace(printWriter);
String ex=s.toString();
logger.error(ex);//可以发邮件
baseDataVo = new BaseDataVo();
baseDataVo.setCode(DataVoStatus.FAIL_CODE);
baseDataVo.setResult(DataVoStatus.FAIL_RESULT);
transactionManager.rollback(status);
return baseDataVo;
}
* 查看log4j 记录文件的日志
* 注解的形式(处理全局异常)
* @ExceptionHandler
* @ControllerAdvice
@ControllerAdvice
public class HxExceptionResovler2 {
@ExceptionHandler(Exception.class)
public ModelAndView resolveException( Exception ex) {
String exMessage = null;
HxException hxEx = null;
ModelAndView mv = new ModelAndView();
if (ex instanceof HxException) {
// 判断下 异常是否是 预期时的异常
// 如果是:就直接根据业务来响应
hxEx = (HxException) ex;
mv.addObject("message", hxEx.getExceptionMessage());
} else {
// 如果不是: 捕获异常信息 ,写日志 ,发送邮件给相关人员
StringWriter s = new StringWriter();
PrintWriter printWriter = new PrintWriter(s);
ex.printStackTrace(printWriter);
exMessage = s.toString();
// 写日志
}
// 返回一个页面
mv.setViewName("error");
return mv;
}
}
* 处理404页
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<img width="80%" height="80%" src="${pageContext.request.contextPath}/images/404.bmp">
</body>
</html>
在web.xml中
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/jsps/404.jsp</location>
</error-page>