首页 > 编程语言 >[java/spring/web] 深入理解:Spring @ExceptionHandler => 自定义应用异常处理器(ApplicationExceptionHandler)

[java/spring/web] 深入理解:Spring @ExceptionHandler => 自定义应用异常处理器(ApplicationExceptionHandler)

时间:2024-10-13 22:34:23浏览次数:10  
标签:web exception java 自定义 Spring ExceptionHandler Exception 异常 public

1 概述:Spring @ExceptionHandler ∈ spring-web

作用

  • ExceptionHandler是 Spring 框架(spring-web模块)提供的一个注解,用于处理应用程序中的异常。
    当应用程序中发生异常时,ExceptionHandler 将优先地拦截异常并处理它,然后将处理结果返回到前端。
    该注解可用于类级别方法级别,以捕获不同级别的异常。

  • Spring中使用ExceptionHandler非常简单,只需在需要捕获异常的方法上注解@ExceptionHandler,然后定义一个方法,该方法将接收异常并返回异常信息,并将该异常信息展示给前端用户。

注意事项

  • Controller类下多个 @ExceptionHandler 上的异常类型不能出现相同的;否则,运行时抛异常。
  • @ExceptionHandler 下方法返回值类型支持多种,常见的ModelAndView,@ResponseBody注解标注,ResponseEntity等类型都可以

2 应用场景

CASE : 基于 具体 Controller 的 异常捕获策略

@RestController
public class XxxxController {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body("An error occurred: " + ex.getMessage());
    }

    @RequestMapping("/xxx/api")
    public String test() throws Exception {
        throw new Exception("Test exception!");
    }
}

CASE : 基于 @ControllerAdvice 的全局异常捕获策略(ApplicationExceptionHandler)

import xxx.common.exception.ApplicationException;
import xxx.model.dto.XResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice // controller 切面注解
public class ApplicationExceptionHandler {
    private final static Logger logger = LoggerFactory.getLogger(ApplicationExceptionHandler.class);

    //已知异常的捕获
    @ExceptionHandler(value = ApplicationException.class)   //表示当 ApplicationException 的异常被抛出时,执行此方法
    public XResponse handleApplicationException(ApplicationException exception){
        logger.error("Operation Fail! errorCode: {}, errorMessage: {}, cause : {}", exception.getErrorCode(), exception.getErrorMessage(),  exception.getCause());
        return XResponse.failure(exception.getErrorCode(), exception.getErrorMessage());
    }

    //未知异常
    @ExceptionHandler
    public XResponse handleOtherException(Exception e){
        //ModelAndView mv=new ModelAndView(); mv.addObject("tips","请稍后测试"); mv.setViewName("defaultError");
        logger.error("Operation Fail! errorMessage: {}, cause : {}", e.getMessage(),  e.getCause());
        XResponse response = XResponse.failure(null, e.getMessage());
        return response;
    }
    //@ExceptionHandler(Exception.class)
    //public ResponseEntity<String> handleException(Exception ex) {
    //    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
    //            .body("An error occurred: " + ex.getMessage());
    //}
}

X 参考文献

标签:web,exception,java,自定义,Spring,ExceptionHandler,Exception,异常,public
From: https://www.cnblogs.com/johnnyzen/p/18463077

相关文章

  • Java中异常处理对程序执行流程的影响
    Java的异常处理机制为程序员提供了一种有效的手段来处理运行时可能发生的各种错误和异常情况。它通过捕获和处理异常来避免程序的崩溃,同时还能进行适当的恢复或终止操作。下面将从多个角度对异常处理对程序执行流程的影响进行分类说明,并结合详细示例来说明其影响。1.正常执行流......
  • 初学Java基础Day18---面相对象之抽象类及其抽象方法,接口的使用及其面试题
    一,抽象类及其抽象方法的使用1.抽象方法:没有代码块,使用abstract修饰的方法,交给非抽象子类去实现注意:抽象方法必须在抽象类中。2.抽象类:使用abstract修饰3.代码实现://抽象类publicabstractclassPerson{//抽象方法publicabstractvoideat();}//在......
  • Safari Webkit, NotAllowedError: The request is not allowed
    使用tauriv2,跑前后端项目学习时,遇到这条报错:UnhandledPromiseRejection:NotAllowedError:Therequestisnotallowedbytheuseragentortheplatforminthecurrentcontext,possiblybecausetheuserdeniedpermission.测试代码console.log(navigator.userAge......
  • Java面试题———MyBatis篇
    目录1、Mybatis中#{}和${}的区别2、当实体类中的属性名和表中的字段名不一样,怎么办3、MyBatis动态SQL了解吗4、ResultType和ResultMap有什么区别1、Mybatis中#{}和${}的区别在Mybatis中#{}和${}都可以用于在sql语句中拼接参数,但是在使用方面有很多的区别1、处理方式......
  • Java面试题———Spring篇
    目录1、谈谈你对SpringIOC的理解2、Spring中有哪些依赖注入方式3、你用过哪些Spring注解4、SpringBean的作用域有几种5、Spring中的bean线程安全吗6、谈谈你对SpringAOP的理解7、AOP的代理有几种方式8、Spring的通知类型有哪些9、了解Spring的事务管理吗10、Spring......
  • 【java面经thinking】一
    目录类加载过程加载:连接初始化GC回收机制(垃圾回收)区域判断对象是否存活回收机制HashMap类加载器加载标识加载机制缓存自定义加载器:JVM内存结构常量池string设置成final按下网址发生类加载过程分为加载,连接和初始化的过程。加载:将.class文件的二进制字节......
  • Java语言中1.方法调用栈 2.栈帧 3.局部变量表 4.操作数栈 5.动态链接 6.方法的入参存
    在Java语言中,理解方法调用栈、栈帧、局部变量表、操作数栈等概念非常重要,它们与方法的执行和内存管理密切相关。下面是对这些概念的详细解释及它们之间的关系:1.方法调用栈(MethodCallStack)方法调用栈是每个线程维护的一块内存区域,用于存储线程执行时的栈帧(每个栈帧对应一次......
  • Web前端开发入门学习笔记之CSS 43-47 --新手超级友好版-复合选择器+css特性篇
         Foreword写在前面的话: 大家好,我是一名刚开始学习HTML的新手。这篇文章是我在学习html过程中的一些笔记和心得,希望能和同样在学习HTML的朋友们分享。由于我的知识有限,文章中可能存在错误或不准确的地方,欢迎大家在评论区提出建议和指正。我非常期待大家的反馈,以便......
  • java项目--零钱通(OOP)
    参考上一篇,项目在主方法中运行的弊端,不易修改,也不能随用随调,结合面向对象的优势,因此有了以下代码的实现:分两个部分,一个类是完成零钱通的各个功能,另一个类用于调用该类的方法。代码如下(功能类展示):/*该类是完成零钱通的各个功能的类*/publicclassOOP{booleanloop......
  • java实现--零钱通
    项目说明:参照微信小程序的零钱通,可以完成收益入账,消费,查看明细,退出系统等功能。以下是功能模块的具体代码:importjava.text.SimpleDateFormat;importjava.util.Scanner;importjava.util.Date;publicclassfirst{publicstaticvoidmain(String[]args){......