@ExceptionHandler注解和@ControllerAdvice注解

@ExceptionHandler注解和@ControllerAdvice注解

上次学习自定义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" ;
        }
    }
}

最后运行启动类即可。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当我们在编写 Spring MVC 应用程序时,我们可以使用 @ControllerAdvice 注解或者在 Controller 中使用 @ExceptionHandler 注解来处理异常。@ControllerAdvice 注解可以用于全局异常处理,而 @ExceptionHandler 注解则用于处理特定的异常。 下面是一个使用 @ControllerAdvice 注解处理异常的示例: ``` @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception e) { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.setViewName("error"); return mav; } } ``` 在上面的示例中,我们定义了一个名为 GlobalExceptionHandler 的类,并使用 @ControllerAdvice 注解将其标记为全局异常处理器。我们还使用 @ExceptionHandler 注解来处理 Exception 类型的异常。当应用程序中出现 Exception 类型的异常时,Spring MVC 将会调用 handleException 方法来处理该异常,并返回一个包含异常信息的 ModelAndView 对象。 如果我们想要在 Controller 中处理特定的异常,我们可以使用 @ExceptionHandler 注解。下面是一个使用 @ExceptionHandler 注解处理特定异常的示例: ``` @Controller public class UserController { @ExceptionHandler(UserNotFoundException.class) public ModelAndView handleUserNotFoundException(UserNotFoundException e) { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.setViewName("userNotFound"); return mav; } @GetMapping("/users/{id}") public String getUser(@PathVariable Long id) { User user = userService.getUserById(id); if (user == null) { throw new UserNotFoundException("User not found with id " + id); } return "userDetails"; } } ``` 在上面的示例中,我们定义了一个名为 UserController 的类,并使用 @Controller 注解将其标记为一个 Controller。我们还使用 @ExceptionHandler 注解来处理 UserNotFoundException 类型的异常。当应用程序中出现 UserNotFoundException 类型的异常时,Spring MVC 将会调用 handleUserNotFoundException 方法来处理该异常,并返回一个包含异常信息的 ModelAndView 对象。 另外,我们还定义了一个名为 getUser 的方法来获取用户信息。如果用户不存在,我们将会抛出一个 UserNotFoundException 异常,该异常将会被 handleUserNotFoundException 方法处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值