讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中统一异常码如何设计_Java异常规范化解析

秋墨大大_8820

秋墨大大_8820

发布时间:2026-01-05 15:53:18

|

591人浏览过

|

来源于php中文网

原创

统一异常码必须用枚举,因其具备类型安全、防拼写错误、可集中管理及附带HTTP状态码等优势;业务异常与系统异常须分包隔离,前者封装错误码无堆栈,后者保留原始堆栈;全局处理器应动态设状态码并统一返回Result结构。

在java中统一异常码如何设计_java异常规范化解析

统一异常码该不该用枚举

该用,而且必须用。字符串或整数常量定义异常码极易导致拼写错误、重复定义、无法集中管理,IDE 也难做校验。枚举天然具备类型安全、可枚举、可附带描述和 HTTP 状态码等能力。

推荐结构:ErrorCode 枚举实现 ErrorCodeInterface 接口(含 getCode()、getMessage()、getHttpStatus()),避免后续扩展时被迫改大量 switch。

public enum ErrorCode implements ErrorCodeInterface {
    USER_NOT_FOUND(40001, "用户不存在", HttpStatus.NOT_FOUND),
    PARAM_VALIDATION_ERROR(40002, "参数校验失败", HttpStatus.BAD_REQUEST),
    SYSTEM_BUSY(50001, "系统繁忙,请稍后重试", HttpStatus.INTERNAL_SERVER_ERROR);

    private final int code;
    private final String message;
    private final HttpStatus httpStatus;

    ErrorCode(int code, String message, HttpStatus httpStatus) {
        this.code = code;
        this.message = message;
        this.httpStatus = httpStatus;
    }

    @Override
    public int getCode() { return code; }
    @Override
    public String getMessage() { return message; }
    @Override
    public HttpStatus getHttpStatus() { return httpStatus; }
}

业务异常和系统异常要不要分包处理

要分,且必须物理隔离。混在一起会导致日志归因困难、监控指标失真、前端兜底策略混乱。

  • BizException 继承 RuntimeException,只封装 ErrorCode 和可选业务上下文(如订单号),不带堆栈(或显式抑制)
  • SystemException 继承 RuntimeException,用于包装 IOException、SQLException 等,保留原始异常堆栈,便于排查基础设施问题
  • 全局异常处理器中:对 BizException 返回 errorCode + message;对 SystemException 记录完整堆栈并返回泛化错误码(如 50099),绝不暴露敏感信息

@ResponseStatus 和统一返回体怎么配合

别用 @ResponseStatus 注解在自定义异常类上。它会强制绑定 HTTP 状态码,但实际中同一个错误码可能对应不同状态(比如 USER_NOT_FOUND 在查询接口返回 404,在创建接口前置校验时可能返回 400)。

立即学习“Java免费学习笔记(深入)”;

正确做法是:所有异常都走统一的 @ControllerAdvice 处理器,根据 ErrorCode.getHttpStatus() 动态设状态码,并统一包装成 Result<T> 结构:

Model Switcher
Model Switcher

根据任务复杂度自动切换不同的AI模型。支持OpenClaw设置中的所有可用模型。当检测到复杂...

下载
@ExceptionHandler(BizException.class)
public ResponseEntity<Result<?>> handleBizException(BizException e) {
    ErrorCode code = e.getErrorCode();
    return ResponseEntity.status(code.getHttpStatus())
            .body(Result.fail(code.getCode(), code.getMessage()));
}

这样既保持协议层语义清晰,又避免状态码被“写死”在异常类型里,方便灰度或兼容性调整。

错误码前缀要不要加业务域标识

要看规模。单体或小团队初期可省略;微服务多、模块超 5 个、跨团队协作时,强烈建议加前缀,比如 USER_40001、ORDER_50002。

原因很实际:

  • 避免合并 PR 时无意覆盖他人错误码(整数易冲突,字符串前缀天然隔离)
  • 日志/监控平台按前缀聚合告警更精准(比如只看 ORDER_* 的 5xx 上升趋势)
  • 前端可根据前缀做差异化提示(USER_* 跳登录页,PAY_* 跳支付重试)

注意:前缀应为英文大写下划线风格,不建议用数字或点号(user.40001 或 1001_40001 都增加解析负担)。

真正麻烦的不是设计规则,而是让所有人——包括新来的同事、临时支援的测试、第三方对接方——能一眼从错误码反查到定义位置、含义、修复责任人。所以枚举类必须配 Javadoc,CI 流程里加校验:新增枚举值必须有非空 @since 和 @see 指向需求单或 Wiki 页面。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6084

2023.10.24

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1417

2024.03.13

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2704

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6084

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5709

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7354

2024.03.22

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn