上次学习自定义error页面,并没有真正的处理异常,在本此学习我们可以使用@ExceptionHandler
注解处理异常,如果在Controller中有一个使用@ExceptionHandler
注解修饰的方法,那么在Controller的任何方法抛出异常,都由该方法处理。
使用
1. 在控制器类中添加@ExceprionHandler注解修饰的方法
@ExceptionHandler
public String handlerException(Exception e){
if(e instanceof SQLException){
return "sqlError" ;
}else if(e instanceof MyException){
return "myError" ;
}else{
return "noError" ;
}
}
2. 创建异常的视图页面
在src/main/resources/templates
目录下创建sqlError.html、myError.html、noError.html页面,当发生异常后,Spring Boot处理并显示相应的页面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>数据库异常</title>
</head>
<body>
数据库异常
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义异常</title>
</head>
<body>
自定义异常
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>未知异常</title>
</head>
<body>
未知异常
</body>
</html>
3. 运行启动类即可
从该案例中可以看出,在控制器类中添加@ExceptionHandler
注解修饰的方法才能处理异常。而一个Spring Boot应用中往往有多个控制器,不太适合在每个控制器中添加一个@ExceptionHandler注解修饰的方法处理异常。我们可以将@ExceptionHandler
注解修饰的方法放到一个父类中,然后所有需要进行异常处理的类继承该父类即可。
例如:在com.controller包中创建父类BaseController中,然后让控制器类TestHanskerExceptionController继承该父类即可处理异常。
父类如下:
import java.sql.SQLException;
@Controller
public class BaseController {
@ExceptionHandler
public String handlerException(Exception e){
if(e instanceof SQLException){
return "sqlError" ;
}else if(e instanceof MyException){
return "myError" ;
}else{
return "noError" ;
}
}
}
控制器类如下:
import com.exception.MyException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import java.sql.SQLException;
@Controller
public class TestHandlerExceptionController extends BaseController{
@RequestMapping("/index1")
public String index(){ //页面导航
return "index1" ;
}
@RequestMapping("/db")
public void db() throws SQLException{
throw new SQLException("数据库异常") ;
}
@RequestMapping("/my")
public void my() throws MyException{
throw new MyException("自定义异常") ;
}
@RequestMapping("/no")
public void no() throws Exception{
throw new Exception("未知异常") ;
}
@RequestMapping("/nofound")
public void nofound() throws Exception{
throw new Exception("404错误") ;
}
}
上述使用符类BaseController去处理异常有很大的好处,就是减少代码量,编写方便,当然也有很大的缺点,就是代码耦合度高,可以使用@ControllerAdvice
注解降低这种父子耦合关系,@ControllerAdvice
注解是一个增强的Controller,使用该Controller可以实现三个方面的功能:
(1)全局异常处理
2)全局数绑定
(3)全局数据预处理。
本次将学习如何使用@ControllerAdvice
进行全局异常处理。
使用@ControllerAdvice
注解的类是当前Spring Boot应有类的统一异常处理类,在该类中使用@ExceptionHandler
进行统一异常处理的方法不需要在每个Controller中逐一定义异常处理方法,这是因为对所有注解了@RequestMMapping
的控制器方法有效。
创建@ControllerAdvice
注解的类,并使用@ExceptionHandler
注解异常处理方法。
import com.exception.MyException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import java.sql.SQLException;
@ControllerAdvice
public class GlobalExceptionHandlerController {
@ExceptionHandler
public String handlerException(Exception e){
if(e instanceof SQLException){
return "sqlError" ;
}else if(e instanceof MyException){
return "myError" ;
}else{
return "noError" ;
}
}
}
最后运行启动类即可。
原文:@ExceptionHandler注解和@ControllerAdvice注解_nuist__NJUPT的博客-CSDN博客_@exceptionhandler
作者: nuist__NJUPT