千家信息网

java后端项目异常的处理方法

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解" java后端项目异常的处理方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习" java后端项目异常的处理方法"吧!一、Controll
千家信息网最后更新 2026年11月01日java后端项目异常的处理方法

本篇内容主要讲解" java后端项目异常的处理方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习" java后端项目异常的处理方法"吧!

一、Controller局部异常处理

1.1. 使用示例

这种异常处理只局部于某个Controller内,如:

@Controller@Slf4j@RequestMapping("/api/demo")public class DemoController {    @ExceptionHandler(Exception.class)    @ResponseBody    public ResponseDTO exceptionHandler(Exception e) {        log.error("[{}] system error", e);        return ResponseDTO.builder()        .errorCode(ErrorCode.SYSTEM_ERROR)        .build();    }}
  • 所有Controller方法(即被RequestMapping注解的方法)抛出的异常,会被该异常处理方法处理。

  • 使用上,在Controller内部,用@ExceptionHandler注解的方法,就会作为该Controller内部的异常处理方法。

  • 并且,它的参数中可以注入如WebRequest、NativeWebRequest等,用来拿到请求相关的数据。

  • 它可以返回String代表一个view名称,也可以返回一个对象并且用@ResponseBody修饰,由框架的其它机制帮你序列化。

此外,它还能够对异常类型进行细粒度的控制,通过注解可以有选择的指定异常处理方法应用的异常类型:

@ExceptionHandler({BusinessException.class, DataBaseError.class })

虽然说全局异常处理HandlerExceptionResolver通过条件判断也能做到, 但是使用这种注解方式明显更具有可读性。

二、ControllerAdvice

2.1 使用示例

刚才介绍的是Controller局部的异常处理,用于处理该Controller内部的特有的异常处理十分有用。

首先,定义一个存放异常处理函数的类,并使用@ControllerAdvice修饰。

@ControllerAdvice(assignableTypes = {GlobalExceptionHandlerMixin.class})public class ExceptionAdvice {    @ExceptionHandler(ErrorCodeWrapperException.class)    @ResponseBody    public ResponseDTO exceptionHandler(ErrorCodeWrapperException e) {        if ((errCodeException.getErrorCode().equals(ErrorCode.SYSTEM_ERROR))) {            log.error(e);        }        return ResponseDTO.ofErroCodeWrapperException(errCodeException);    }}

@ExceptionHanlder修饰的方法的写法和Controller内的异常处理函数写法是一样的。

2.2 控制生效的Controller范围

注意到,我是这样编写注解的:

@ControllerAdvice(assignableTypes = {GlobalExceptionHandlerMixin.class})

它用来限定这些异常处理函数起作用的Controller的范围。如果不写,则默认对所有Controller有效。

这也是ControllerAdvice进行统一异常处理的优点,它能够细粒度的控制该异常处理器针对哪些Controller有效,这样的好处是:

  • 一个系统里就能够存在不同的异常处理器,Controller也可以有选择的决定使用哪个,更加灵活。

  • 不同的业务模块可能对异常处理的方式不同,通过该机制就能做到。

  • 设想一个一开始并未使用全局异常处理的系统,如果直接引入全局范围内生效的全局异常处理,势必可能会改变已有Controller的行为,有侵入性。也就是说,如果不控制生效范围,即默认对所有Controller生效。如果控制生效范围,则默认对所有Controller不生效,降低侵入性。

如刚才示例中的例子,只针对实现了GlobalExceptionHandlerMixin接口的类有效:

@Controller@Slf4j@RequestMapping("/api/demo")public class DemoController implements GlobalExceptionHandlerMixin {}

ControllerAdvice支持的限定范围:

  • 按注解:@ControllerAdvice(annotations = RestController.class)

  • 按包名:@ControllerAdvice("org.example.controllers")

  • 按类型:@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})

三、总结

以上几种方式是Spring专门为异常处理设计的机制。

就我个人而言,由于ControllerAdvice具有更细粒度的控制能力,所以我更偏爱于在系统中使用ControllerAdvice进行统一异常处理。

除了用异常来传递系统中的意外错误,也会用它来传递处于接口行为一部分的业务错误。

这也是异常的优点之一,如果接口的实现比较复杂,分多层函数实现,如果直接传递错误码,那么到Controller的路径上的每一层函数都需要检查错误码,退回到了C语言那种可怕的"写一行语句检查一下错误码"的模式。

当然,理论上,任何能够给Controller加切面的机制都能变相的进行统一异常处理。比如:

  • 在拦截器内捕获Controller的异常,做统一异常处理。

  • 使用Spring的AOP机制,做统一异常处理。

到此,相信大家对" java后端项目异常的处理方法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

处理 方法 注解 范围 控制 函数 机制 错误 统一 全局 系统 项目 不同 有效 局部 接口 方式 示例 类型 粒度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 科技互联网企业 河南真二互联网科技有限公司 喔噻互联网科技 互联网 的科技创新 互联网与未来科技 科技创新互联网企业 碳银互联网科技有限公司 互联网金融 科技创新 齐家互联网科技有限公司 安控科技rtu产品工业互联网 广州恒生互联网科技有限 乌鲁木齐新华智原互联网科技学校 西安左小互联网科技有限公司 福仕德教育科技互联网 唐山双旺合互联网科技产业园 恒生科技指数 中概互联网 互联网的黑科技实验室 现代科技的标志之一的互联网 互联网科技公司简介 科技互联网公司装修 北京互联网络科技有限公司 居家互联网科技有限公司 中化能源互联网科技招聘 河南猎农互联网科技有限公司 语蝶互联网科技有限公司 恒生互联网科技业指数调整周期 互联网相关科技技术 山东大美朱楼互联网科技有限公司
0