前言
先看一个基础的案例
@Controller
@RequestMapping("demo")
public class DemoController {
@RequestMapping("demo")
public String demo(){
try {
System.out.println("demo ok ...");
int n = 1/0;//报错: 除零异常
} catch (Exception e) {
e.printStackTrace();
return "500";
}
return "hello";
}
}
上述是我们手动加try-catch的过程,试想一下,如果每遇到一个异常,我们都要这样手动去处理的话,业务代码一旦多起来以后,我们处理异常就会很麻烦,所以我们下面会介绍两种处理方式。
传统方式异常处理
创建一个controller类
@Controller
@RequestMapping("demo")
public class DemoController {
@RequestMapping("demo")
public String demo(){
System.out.println("demo ok ...");
int n = 1/0;//报错: 除零异常
return "hello";
}
@RequestMapping("login")
public String login(String username,String password){
System.out.println("login ...");
System.out.println("username: "+username);
System.out.println("password: "+password);
if("xiaochen".equals(username) && "123".equals(password)){
return "hello";//返回成功页面
}else{
throw new UserNameNotFoundException("用户名不正确!!");
}
}
}
创建一个GlobalException
@Component
public class GlobalException implements HandlerExceptionResolver {
//resolveExcpetion: 当控制器中任意一个方法出现异常时,如果该控制器的方法没有自己异常处理(try...catch),则会进入当前方法
//注意:在异常处理这个方法中 完成自定义异常处理
//参数1: request 当前请求对象
//参数2: response 当前请求对应响应对象
//参数3: 当前出现错误的方法对象
//参数4: 出现异常的异常对象
//返回值: modelAndview 模型和视图
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("这是全局异常处理....");
System.out.println("当前异常为: "+ex);
ModelAndView modelAndView = new ModelAndView();
//针对不同异常类型跳转不同页面
if(ex instanceof UserNameNotFoundException){
modelAndView.setViewName("error");
return modelAndView;
}
modelAndView.setViewName("500");
return modelAndView;
}
}
异常处理展示
前后端分离方式异常处理
准备一个controller请求
@RestController
@RequestMapping("demo")
public class DemoController {
@GetMapping("/{id}")
public ResponseEntity<String> demo(@PathVariable("id") Integer id) {
System.out.println("demo ok "+id);
if(id<0) throw new IllegalNumberException("无效id,请检查!");
return new ResponseEntity<>("demo ok ", HttpStatus.OK);
}
@GetMapping
public ResponseEntity<String> demo(){
System.out.println("demo ok!");
int n=1/0;
return new ResponseEntity<>("demo ok!",HttpStatus.OK);
}
}
定义一个GlobalException类
@ControllerAdvice
public class GlobalException {
//处理exception子类异常
@ExceptionHandler(value = Exception.class) //用在方法上 作用:用来处理指定异常 value属性: 用来指定处理异常类型
@ResponseBody
public ResponseEntity<String> exceptionHandler(Exception ex) {
System.out.println("进入自定义异常处理");
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(value = IllegalNumberException.class) //用在方法上 作用:用来处理指定异常 value属性: 用来指定处理异常类型
@ResponseBody
public ResponseEntity<String> illegalNumberExceptionHandler(Exception ex) {
System.out.println("进入非法参数异常的处理");
return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
异常处理展示: