springmvc统一异常处理方法

 

方式一:

@ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上
@ExceptionHandler:用于全局处理控制器里的异常

所以在写项目的时候都service层和mapper层都使用抛异常的方式,把异常都抛到controller层,然后来统一处理.这个类其实就相当于一个controller,也能重定向,转发页面.

这个是统一异常处理类, @ControllerAdvice这个注解声明的表示统一异常处理,@ExceptionHandler(value = Exception.class)这个注解写在方法上表示,该方法处理哪个异常.

package com.buba.exceptionController;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
//捕捉工程所有异常
@ControllerAdvice
public class GloableExceptionController {
    //拦截Exception类型异常
    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultExceptionHandler(HttpServletRequest request,Exception ex){
        ModelAndView modelAndView = new ModelAndView("defaultException");
        //获取请求路径
        modelAndView.addObject("url",request.getRequestURL());
        //异常对象
        modelAndView.addObject("ex",ex);
        //异常对象信息
        modelAndView.addObject("message",ex.getMessage());
        return modelAndView;
    }

    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)
    public ModelAndView defaultExceptionHandler2(HttpServletRequest request,Exception ex){
        ModelAndView modelAndView = new ModelAndView("defaultException2");
        //获取请求路径
        modelAndView.addObject("url",request.getRequestURL());
        //异常对象
        modelAndView.addObject("ex",ex);
        //异常对象信息
        modelAndView.addObject("message",ex.getMessage());
        return modelAndView;
    }
} 

这是两个异常页面,进行测试 

我controller写了两个异常方法,第一个是ArrayIndexOutOfBoundsException这个异常,第二个是NullPointerException

当访问第二个异常的时候,因为在异常处理类中没有精确指明有空指针异常,所以会找它的父类,exception,所以出来的是第一个异常页面

当访问第一个异常的时候,因为在异常处理类中有明确指定的这个异常,所以返回的是第二个页面

总结: 也就是说这个异常处理类中,可以获取所有的异常都拿excepion来接收,也可以明确指定哪个异常,跟上下顺序无关,有明确指定的异常会找明确指定的,没有就找父类.

 

方式二:配置简单异常处理器

方式三:

先导入依赖,slf4j是一个通用的平台,就是如果以后不使用log4j了改成别的日志文件了直接换jar包就可以了,它是同用的接口 

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>

然后创建log4j.properties必须叫这个名字,放到resources下面

log4j.rootLogger=INFO,A3,STDOUT

log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=[%p] [%l] %10.10c - %m%n

log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.file=logs/server.log
log4j.appender.A3.MaxFileSize=1024KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%n

异常一层层往上抛,直到DispatcherServlet,然后它把异常交给HandlerExceptionResovler来统一处理

编写全局异常处理类,写到表现层

package cn.e3mall.search.exception;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

/**
 * 全局异常处理器
 * <p>Title: GlobalExceptionResolver</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {
	
	private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionResolver.class); 

	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		//打印控制台
		ex.printStackTrace();
		//写日志
		logger.debug("测试输出的日志。。。。。。。");
		logger.info("系统发生异常了。。。。。。。");
		logger.error("系统发生异常", ex);
		//发邮件、发短信
		//使用jmail工具包。发短信使用第三方的Webservice。
		//显示错误页面
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("error/exception");
		return modelAndView;
	}

}

然后项目中出错的话就会在这生成错误信息

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值