SpringBoot全局异常处理
时间:2022-06-17
本文章向大家介绍SpringBoot全局异常处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
全局异常处理是个比较重要的功能,一般在项目里都会用到。 我大概把一次请求分成三个阶段,来分别进行全局的异常处理。 一:在进入Controller之前,譬如请求一个不存在的地址,404错误。 二:在执行@RequestMapping时,进入逻辑处理阶段前。譬如传的参数类型错误。 三:以上都正常时,在controller里执行逻辑代码时出的异常。譬如NullPointerException。 第一种情况:
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by wuwf on 17/4/12.
*/
@RestController
public class FinalExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping(value = "/error")
public Object error(HttpServletResponse resp, HttpServletRequest req) {
// 错误处理逻辑
return "其他异常";
}
}
第二种情况: 使用@ControllerAdvice
/**
* Created by wuwf on 17/3/31.
* 全局异常处理
*/
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static Logger logger = LogManager.getLogger(GlobalExceptionHandler.class.getName());
// @ExceptionHandler(value = Exception.class)
// public ModelAndView defaultHandler(HttpServletRequest request, Exception e) throws Exception {
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.addObject("exception", e);
// modelAndView.addObject("url", request.getRequestURL());
// modelAndView.setViewName("error");
// return modelAndView;
// }
/**
* 在controller里面内容执行之前,校验一些参数不匹配啊,Get post方法不对啊之类的
*/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
System.out.println("错误");
return new ResponseEntity<Object>("出错了", NOT_EXTENDED);
}
}
定义一个类,使用@ControllerAdvice注解,继承ResponseEntityExceptionHandler类,这个类里面实现了很多方法,可以去看看,包括一些参数转换,请求方法不支持等等之类的异常都会被捕获。 被捕获的原因是@ExceptionHandler标签,里面所有的异常类只要发生了,就会被这个方法所捕获。
第三种情况: 当第一、第二种都没出异常,进入到实际逻辑执行了,然后发生了异常,这样就可以自己定义一个ExceptionHandler的方法,来处理相应的Exception。
/**
* Created by wuwf on 17/3/31.
* 全局异常处理
*/
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static Logger logger = LogManager.getLogger(GlobalExceptionHandler.class.getName());
// @ExceptionHandler(value = Exception.class)
// public ModelAndView defaultHandler(HttpServletRequest request, Exception e) throws Exception {
// ModelAndView modelAndView = new ModelAndView();
// modelAndView.addObject("exception", e);
// modelAndView.addObject("url", request.getRequestURL());
// modelAndView.setViewName("error");
// return modelAndView;
// }
/**
* 在controller里面内容执行之前,校验一些参数不匹配啊,Get post方法不对啊之类的
*/
@Override
protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
System.out.println("错误");
return new ResponseEntity<Object>("出错了", NOT_EXTENDED);
}
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ErrorInfo<String> jsonHandler(HttpServletRequest request, Exception e) throws Exception {
ErrorInfo<String> r = new ErrorInfo<>();
r.setMessage(e.getMessage());
r.setCode(ErrorInfo.ERROR);
r.setData("发生异常");
r.setUrl(request.getRequestURL().toString());
log(e, request);
return r;
}
private void log(Exception ex, HttpServletRequest request) {
logger.error("************************异常开始*******************************");
// if(getUser() != null)
// logger.error("当前用户id是" + getUser().getUserId());
logger.error(ex);
logger.error("请求地址:" + request.getRequestURL());
Enumeration enumeration = request.getParameterNames();
logger.error("请求参数");
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement().toString();
logger.error(name + "---" + request.getParameter(name));
}
StackTraceElement[] error = ex.getStackTrace();
for (StackTraceElement stackTraceElement : error) {
logger.error(stackTraceElement.toString());
}
logger.error("************************异常结束*******************************");
}
}
上面都是restful的情况,返回个json。对于要返回view的按下面的处理。
@Component
public class ExceptionHandler implements HandlerExceptionResolver {
private static Logger log = LoggerFactory.getLogger(ExceptionHandler.class);
@Override
public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex) {
// 异常处理逻辑 goes here
log.info("got exception: {}", ex.getClass());
return new ModelAndView("pc/500");
}
}
从SpringMVC源码中可知,DispatcherServlet中如果产生了异常,则接下来会在processDispatchResult()方法中查询当前容器中是否有HandlerExceptionResolver接口的实现类,如果有则调用它的resolveException()方法,得到返回的View,如果没有则使用框架默认的异常处理类。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Go语言小书 | 关于编译和语法
- Go语言小书 | 小试牛刀,从hello world开始
- 3分钟短文 | Laravel 中间件传递数据到控制器
- 3分钟短文 | Laravel 表单验证数组的数据
- 3分钟短文:Laravel 编程中优雅地添加定义常量
- 极客算法训练笔记(四),栈和队列,从实际应用看数据结构
- 微博爬虫出错居然还和网络运营商有关
- 8.深入k8s:资源控制Qos和eviction及其源码分析
- 1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知
- CNN不用乘法? AdderNet和DeepShift论文理解
- 动手构建地铁关系网,实现最短路径查询
- Java并发编程(08):Executor线程池框架
- 用Scipy求解单个正态总体的置信区间
- 架构设计 | 基于电商交易流程,图解TCC事务分段提交
- 用Gaussian做CASSCF计算