SpringBoot全局异常处理(三十)下

简介: SpringBoot全局异常处理(三十)下

四.二 自定义全局异常处理器 MyExceptionHandler

通过 @ExceptionHandler 注解,接收相应的异常信息

@RestControllerAdvice
public class MyExceptionHandler {
    /**
     * 处理空指向的异常信息
     * @date 2021/11/10 11:52
     * @author zk_yjl
     * @param
     * @return top.yueshushu.learn.response.OutputResult
     */
    @ExceptionHandler(NullPointerException.class)
    public OutputResult npeException(HttpServletRequest req, NullPointerException e){
        return OutputResult.fail(e.getMessage());
    }
    /**
     * 处理算术的异常信息
     * @date 2021/11/10 11:52
     * @author zk_yjl
     * @param
     * @return top.yueshushu.learn.response.OutputResult
     */
    @ExceptionHandler(ArithmeticException.class)
    public OutputResult ariException(HttpServletRequest req, ArithmeticException  e){
        return OutputResult.fail(e.getMessage());
    }
    /**
     * 处理数组下标越界异常的异常信息
     * @date 2021/11/10 11:52
     * @author zk_yjl
     * @param
     * @return top.yueshushu.learn.response.OutputResult
     */
    @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
    public OutputResult arrException(HttpServletRequest req, ArrayIndexOutOfBoundsException  e){
        return OutputResult.fail(e.getMessage());
    }
    /**
     * 处理自定义的业务异常的异常信息
     * @date 2021/11/10 11:52
     * @author zk_yjl
     * @param
     * @return top.yueshushu.learn.response.OutputResult
     */
    @ExceptionHandler(BusinessException.class)
    public OutputResult busException(HttpServletRequest req, BusinessException  e){
        return OutputResult.fail(e.getMessage());
    }
    /**
     * 处理其他的另外异常的异常信息
     * @date 2021/11/10 11:52
     * @author zk_yjl
     * @param
     * @return top.yueshushu.learn.response.OutputResult
     */
    @ExceptionHandler(Exception.class)
    public OutputResult otherException(HttpServletRequest req, Exception  e){
        return OutputResult.fail(e.getMessage());
    }
}


这时候,再进行访问:


image.png

image.png

image.png

image.png


目前老蝴蝶的 状态码都是 500, 实际用的时候,会定义成不同的状态码, npe表示 300, 除 o表示 301,其它异常都有各自的状态码。


前端可以根据状态码,进行不同的展示信息


从而实现前后端分离下的全局异常处理机制.


五. 非抛出异常处理

在实际的业务中,会有 dao数据库层,servie层, controller 层,每一层都会有相应的异常抛出,也可以各自在自己的层捕获异常。


当异常被补获时,没有被抛出时,是什么情况呢? 一般不会在 dao层捕获异常.


五.一 Service 层

public interface ExceptionService {
    /**
     普通的两个异常信息,不补获
     */
    public void div();
    /**
     普通的两个异常信息,内部进行补获
     */
    public void tryDiv();
    /**
     往外抛出异常
     */
    public void throwDivExcepiton() throws Exception;
    public void throwBusExcepiton() throws Exception;
}


五.二 SerivceImpl 实现

@Service
public class ExceptionServiceImpl implements ExceptionService {
    @Override
    public void div() {
        int a=10/0;
    }
    @Override
    public void tryDiv() {
        try{
            int a=10/0;
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @Override
    public void throwDivExcepiton() throws Exception {
        try{
            int a=10/0;
        }catch (Exception e){
            throw e;
        }
    }
    @Override
    public void throwBusExcepiton() throws Exception {
        throw new BusinessException("数据库查询出现异常");
    }
}


五.三 Controller 层 ServiceExceptionController

@RestController
@RequestMapping("/exce")
public class ServiceExceptionController {
    @Autowired
    private ExceptionService exceptionService;
    @GetMapping("/div")
    public OutputResult div(){
        exceptionService.div();
        return OutputResult.success();
    }
    @GetMapping("/tryDiv")
    public OutputResult tryDiv(){
        exceptionService.tryDiv();
        return OutputResult.success();
    }
    @GetMapping("/throwDivExcepiton")
    public OutputResult throwDivExcepiton() throws Exception {
        exceptionService.throwDivExcepiton();
        return OutputResult.success();
    }
    @GetMapping("/throwBusExcepiton")
    public OutputResult throwBusExcepiton() throws Exception {
        exceptionService.throwBusExcepiton();
        return OutputResult.success();
    }
    @GetMapping("/throwDivExcepiton2")
    public OutputResult throwDivExcepiton2() {
      try{
          exceptionService.throwDivExcepiton();
          return OutputResult.success();
      }catch (Exception e){
          e.printStackTrace();
          return OutputResult.success("内部补获异常");
      }
    }
    @GetMapping("/throwBusExcepiton2")
    public OutputResult throwBusExcepiton2() {
        try{
            exceptionService.throwBusExcepiton();
            return OutputResult.success();
        }catch (Exception e){
            e.printStackTrace();
            return OutputResult.success("内部补获异常");
        }
    }
    /*
    * 异常处理,
    * 出现的异常,没有显式的捕获,都会接收到。如果被try  catch 到,即不往外抛出, 抛出到 controller 层的话, 是不会接收到这个异常的。
    * 从而不触发异常机制信息.
    * */
}


运行处理展示:


五.三.一 div 方法

service 层和 controller 层均没有 捕获异常

image.png



五.三.二 tryDiv

service 层捕获异常, controller 层没有捕获

image.png



没有接收到异常信息


五.三.三 throwDivExcepiton

service 层捕获异常,但往外抛出了, controller 层继续抛出


image.png


五.三.四 throwBusExcepiton

service 层抛出异常, controller 层继续抛出


image.png


五.三.五 throwDivExcepiton2

service 层捕获异常,但继续抛出异常, controller 捕获异常


image.png


五.三.六 throwBusExcepiton2

service 层抛出异常, controller 捕获异常


image.png


总结: 异常捕获,是在 Controller 层再往上一层进行处理的, 如果 Controller 层抛出异常,才能获取到,转换成 json的形式,如果 controller 层不抛出异常,是无法获取到的,也无法转换成 json的形式.


相关文章
|
5月前
|
JSON 前端开发 Java
解决Spring MVC中No converter found for return value of type异常
在Spring MVC开发中遇到`No converter found for return value of type`异常,通常是因缺少消息转换器、返回值类型不支持或转换器优先级配置错误。解决方案包括:1) 添加对应的消息转换器,如`MappingJackson2HttpMessageConverter`;2) 自定义消息转换器并实现`HttpMessageConverter`接口,设置优先级;3) 修改返回值类型为如`ResponseEntity`的合适类型。通过这些方法可确保返回值正确转换为响应内容。
345 1
|
5月前
|
Java Spring 容器
解决Spring的UnsatisfiedDependencyException异常的方法
在Spring开发中,UnsatisfiedDependencyException异常意味着依赖注入失败,影响应用稳定性。该异常由Spring容器在无法满足bean依赖时抛出,常见原因包括bean定义错误、循环依赖、多个候选bean等。解决方法包括:检查bean定义和注入的正确性、解决循环依赖、确认依赖包的兼容性、使用@Qualifier或@Primary注解。通过日志、调试工具和异常对比来定位问题。持续学习Spring框架有助于更好地解决此类异常。
3214 1
|
2月前
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
237 0
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
2月前
|
消息中间件 Java 开发工具
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
|
2月前
|
Java Spring
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
|
2月前
|
Java Spring
【Azure 服务总线】Spring Cloud 的应用 使用Service Bus 引起 org.springframework.beans.BeanInstantiationException 异常,无法启动
【Azure 服务总线】Spring Cloud 的应用 使用Service Bus 引起 org.springframework.beans.BeanInstantiationException 异常,无法启动
|
2月前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
|
2月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
68 0
|
3月前
|
Java Spring 容器
Spring循环依赖问题之两个不同的Bean A,导致抛出异常如何解决
Spring循环依赖问题之两个不同的Bean A,导致抛出异常如何解决
|
3月前
|
存储 缓存 Java
Spring循环依赖问题之循环依赖异常如何解决
Spring循环依赖问题之循环依赖异常如何解决
下一篇
无影云桌面