springmvc之异常处理(包含处理步骤)

目录

一、介绍

1.异常

2.出现异常现象的常见位置和常见诱因如下

3.异常的分类

(1)业务异常(BusinessException)

(2)系统异常(SystemException)

(3)其他异常(Exception)

4.异常的注解

(1)@restcontrolleradvice

(2)@ExceptionHandler

5.异常怎么处理?

二、出现异常的解决例子

1.在一个类里面进行自定义异常种类编号

2.在可能会出现异常的地方标记这些编号(触发自定义异常) 

3.统一在一个类里面去拦截处理这些出现的异常(异常里面带了编号)

4.处理结果展示


一、介绍

1.异常

在程序开发过程当中不可避免遇到异常现象。系统中的Dao、Service、Controller出现都通过throws  Exception向上抛出,最后由springMVC前端控制器交由异常处理器进行异常处理。

通俗理解:就是一层一层往上抛直到抛给前端控制器调用异常处理器处理

2.出现异常现象的常见位置和常见诱因如下

(1)框架内部抛出的异常:因使用不合规导致

(2)数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)

(3)业务层抛出的异常:因业务逻辑书写错误导致(遍历业务书写操作,导致索引异常等)

(4)表现层抛出的异常:因数据收集、校验等规矩导致(例如:不匹配的数据类型间导致异常)

(5)工具类抛出的异常:因工具栏书写不严谨健壮导致(例如:必要释放的连接长期未释放等)

3.异常的分类

(1)业务异常(BusinessException)

规范的用户行为产生异常,不规范的用户行为操作产生的异常

解决办法:发送对应的消息传递给用户,提醒规范操作

(2)系统异常(SystemException)

项目运行过程中可预计且无法避免的异常

解决办法:发送固定消息给用户,安抚用户(例如,您的网络不通畅,请稍后再试)。还有发送特定的消息给运维人员,提醒维护。记录日志

(3)其他异常(Exception)

编程人员没有预测到的异常。

解决办法:发送固定的消息给用户,安抚用户,发送特定的消息给编程人员,提醒维护。记录日志

4.异常的注解

(1)@restcontrolleradvice

这个注解是异常注解,放在类上面,代表这个类统一处理异常,是rest开头的,代表处理rest风格的异常,基于AOP思想,所以又含有advice,通常配合@ExceptionHandler使用,这个异常代表指定要拦截哪些异常。

位置:Rest风格开发的控制器增强类定义上方

作用:为Rest风格开发的控制器类做增强(此注解自带ResponseBody注解和Component注解,具备对应的功能)

(2)@ExceptionHandler

这个注解是拦截指定异常的,通常写在方法的上面。告诉这个方法里面要拦截哪些异常。与@restcontrolleradvice搭配使用比较多

位置:专用于异常处理的控制器方法上方

作用:设置异常指定的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前的方法执行。 

5.异常怎么处理?

在各个层级出现了异常要分别处理很麻烦,就统一放到最上层的表现层去统一处理就好了 。要用AOP的思想去处理。

(1)使用Spring MVC提供的简单异常处理器SimapleMappingExceptionResolver

(2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器(推荐)

二、出现异常的解决例子

总结

1.在一个类里面进行自定义异常种类编号

//1:自定义项目系统级异常
public class SystemException extends RuntimeException{
    private Integer code;
    public SystemException( Integer code, String message){
        super(message);
        this.code = code;
    }

    public SystemException( Integer code,String message,Throwable cause){
    super(message, cause);
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
}
//2:自定义项目业务级异常
public class BusinessException extends RuntimeException{
    private Integer code;
    public BusinessException( Integer code, string message){
        super(message);
        this.code = code;
    }

    public BusinessException(Integer code,String message,Throwable cause) {
        super(message,cause);
        this.code = code;
    }
    public Integer getcode() {
        return code;
    }
    public void setCode (Integer code) {
        this.code = code;
    }
}
//3.自定义异常编号
public class code {
    public static final Integer SYSTEM_UNKNOW_ERROR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERROR =50002;
    public static final Integer PROJECT_VAL IDATE_ERROR = 60001;
    public static final Integer PROJECT_BUSINESS_ERROR = 60002;
}

2.在可能会出现异常的地方标记这些编号(触发自定义异常) 

//4.标记可能会出现异常的地方
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    public Book getById(Integer id){
        if( id<0 ){
            throw new BusinessException(Code.PROECT_BUSINESS_ERROR , "请勿进行非法操作! ");
        }
        return bookDao.getById(id);
    }
}

3.统一在一个类里面去拦截处理这些出现的异常(异常里面带了编号)

//5:拦截并处理异常
@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler (BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode() , null,ex.getMessage());
    }
    @ExceptionHandler (SystemException.class)
    public Result doSystemException(SystemException ex){
        /记录日志(错误堆栈)
        //发送邮件给开发人员
        //发送短信给运维人员
        return new Result(ex.getCode() ,null,ex.getMessage());
    }
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
        /记录日志(错误堆栈)
        //发送邮件给开发人员
        //发送短信给运维人员
        return new Result(Code.SYSTEM_UNKNOW_ERROR , null, "系统繁忙,请联系管理员!");
    }
}

4.处理结果展示

{
"data" : null,
"code" : 60002,
"msg":"请勿进行非法操作!”
}

有什么问题都可以评论区留言,看见都会回复的

如果你觉得本篇文章对你有所帮助的,多多支持吧!!!

点赞收藏评论,抱拳了!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Spring MVC 中,我们可以通过实现一个异常处理器来统一处理控制器抛出的异常。具体步骤如下: 1. 实现一个异常处理器类,并添加 @ControllerAdvice 注解。 2. 在异常处理器类中定义处理不同类型异常的方法,并使用 @ExceptionHandler 注解标记。 3. 在方法中编写异常处理逻辑,例如将异常信息记录到日志中、返回错误信息等。 4. 如果需要返回 JSON 格式的错误信息,可以使用 @ResponseBody 注解。 以下是一个简单的示例: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody public Map<String, Object> handleException(Exception e) { Map<String, Object> errorMap = new HashMap<>(); errorMap.put("code", "500"); errorMap.put("message", e.getMessage()); return errorMap; } @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public Map<String, Object> handleValidationException(MethodArgumentNotValidException e) { Map<String, Object> errorMap = new HashMap<>(); errorMap.put("code", "400"); errorMap.put("message", "参数校验失败"); List<String> errors = e.getBindingResult() .getFieldErrors() .stream() .map(FieldError::getDefaultMessage) .collect(Collectors.toList()); errorMap.put("errors", errors); return errorMap; } } ``` 在上述示例中,我们定义了两个处理异常的方法:handleException 和 handleValidationException。handleException 方法处理所有未被其他方法处理的异常,返回一个包含错误码和错误信息的 Map 对象;handleValidationException 方法处理参数校验失败的异常,并将校验失败的所有错误信息返回。 最后,需要注意的是,如果同时存在多个异常处理方法,Spring MVC 会按照异常类型匹配最合适的处理方法。如果没有找到合适的处理方法,则会将异常抛给 Servlet 容器进行处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云边的快乐猫

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值