05-springmvc 异常处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 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>

猜你喜欢

转载自blog.csdn.net/linzhaoliangyan/article/details/88813062