1、全局捕获异常:整个Web请求项目 全局捕获异常
1.1、应用场景:如果在我们的一个类的方法中出现异常(以项目中的ErrorController为例),那么在用户请求页面时则会报出原生的英文404错误。因此我们需要使用到try catch来把异常抛出。
1.2、但如果我们需要用到异常抛出的方法太多,那么在每个方法中写try catch就会非常麻烦,因此我们需要使用到全局捕获异常的方式。
2、全局捕获异常的原理: 使用AOP技术,采用异常通知
2.1、实施方法 (准备步骤:新建一个和controller包同级的error 包,建一个类)
2.1.1、捕获返回json格式:
1、添加注解@ControllerAdvice(basePackages="com.ssrtest02.controller");用于扫描controller包中存在的所有异常
2、在类中添加拦截方法errorResult(),方法返回一个Map类型的集合(errorResultMap),方法使用注解@ResponseBody
3、在方法中写上定义好的Map集合
4、在拦截方法errorResult()上再添加一个@ExceptionHandler(RuntimeException.class),表示该方法主要拦截的异常类型,这里的异常类型为RuntimeException(运行时异常)
5、注意:此时我们存在异常的controller类里就不能再用try catch了。也就是把异常交给我们的全局异常处理方法来解决
6、在实际的公司开发中,我们是需要把这些错误写到日志中的
7、GlobalExceptionHandler类源码:
package com.ssrtest02.error;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* 全局捕获异常 使用AOP技术,采用异常通知方法
* 1、捕获返回json格式
* 2、捕获返回页面
*/
@ControllerAdvice(basePackages = "com.ssrtest02.controller")
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String,Object> errorResult(){
//注意:在实际的公司开发过程中,要把错误记录在日志中
Map<String,Object> errorResultMap=new HashMap<String,Object>();
errorResultMap.put("errorCode","1314520");
errorResultMap.put("errorMsg","系统喜欢你到死机");
return errorResultMap;
}
}
8、errorController类代码:
package com.ssrtest02.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ErrorController {
// private static final Logger logger = LoggerFactory.getLogger(JspController.class);
@RequestMapping("/getUser")
public String getUser(int i){
//这是在没有全局异常处理时,我们对异常的处理
// int j=0;
// try {
// j = 1 / i;
// }catch (Exception e){
// return "系统异常";
// }
//这是我们开始使用全局异常处理后的代码,在本方法类里就不需要在进行异常的处理了
int j = 1 / i;
return "success "+j;
}
@RequestMapping("/getMember")
public String getMember(String name, Integer age){
// logger.info("name"+name+",age:"+age);
return "success getMember";
}
}
2.1.2、捕获返回页面
和上面步骤基本一致,但需要把方法的注解改成@modeAndView