0

0

如何自定义Java异常类_业务逻辑错误封装方案

P粉602998670

P粉602998670

发布时间:2026-03-12 14:22:03

|

709人浏览过

|

来源于php中文网

原创

业务错误应使用自定义 runtimeexception(如 bizexception),避免模糊预期失败与意外崩溃边界,需提供多构造函数支持异常链、错误码解耦及日志友好输出。

如何自定义java异常类_业务逻辑错误封装方案

为什么不能直接 throw new RuntimeException("xxx")

业务错误不是程序崩溃,用 RuntimeException 会模糊“预期失败”和“意外崩溃”的边界。调用方无法区分是参数错了还是数据库挂了,更没法针对性捕获重试或降级。

  • 所有 RuntimeException 子类默认不强制捕获,下游容易漏处理,上线后才发现订单创建失败却没日志、没告警
  • 框架(如 Spring)对 RuntimeException 默认回滚事务,但像“余额不足”这种业务拒绝,不该触发回滚——它根本没改数据库
  • 错误码、错误上下文(如订单ID、用户ID)无法结构化携带,日志里只剩一串字符串,排查时得靠猜

自定义异常类必须重写哪些构造函数

Java 异常链和日志打印依赖构造函数签名。只写一个带 String 的构造函数,会导致上游用 new BizException("xxx", e) 时丢失原始异常栈,调试时看不到根因。

  • 必须提供 BizException(String message) —— 用于简单提示
  • 必须提供 BizException(String message, Throwable cause) —— 用于包装底层异常(如 DAO 层抛出的 SQLException
  • 建议加 BizException(ErrorCode code, String message) —— 把错误码和消息解耦,方便国际化或前端映射

示例:

public class BizException extends RuntimeException {<br>    private final ErrorCode code;<br><br>    public BizException(String message) {<br>        super(message);<br>        this.code = ErrorCode.UNKNOWN;<br>    }<br><br>    public BizException(String message, Throwable cause) {<br>        super(message, cause);<br>        this.code = ErrorCode.UNKNOWN;<br>    }<br><br>    public BizException(ErrorCode code, String message) {<br>        super(message);<br>        this.code = code;<br>    }<br>}

ErrorCode 枚举要不要放 HTTP 状态码

不要。HTTP 状态码是协议层概念,和业务语义无关。把 400 塞进 ErrorCode 枚举,会导致 RPC 调用(如 Dubbo、gRPC)或消息队列场景下误用——它们根本不走 HTTP。

百宝箱
百宝箱

百宝箱是支付宝推出的一站式AI原生应用开发平台,无需任何代码基础,只需三步即可完成AI应用的创建与发布。

下载

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

  • 枚举只管业务维度:比如 ORDER_NOT_FOUNDINSUFFICIENT_BALANCE,值用纯数字(如 10011002),和协议解耦
  • HTTP 状态码由 Controller 层统一映射:Spring MVC 用 @ControllerAdvice + @ExceptionHandler 根据 ErrorCode 决定返回 400 还是 409
  • RPC 场景下,这个枚举可序列化传给下游,对方按码做本地化处理,不用硬编码状态码

log.error() 里要不要打印 e.printStackTrace()

不要。SLF4J 的 logger.error(msg, e) 已自动输出完整栈,多打一次 e.printStackTrace() 会让日志重复、错行,还可能因线程竞争导致日志混乱。

  • 正确写法:log.error("创建订单失败,orderNo={}", orderNo, ex); —— 消息清晰,异常对象作为参数传入
  • 如果异常是自定义的,确保 getMessage() 返回的是业务友好文案(如“库存不足”,而非“java.lang.NullPointerException”)
  • 敏感字段(如手机号、身份证号)要在 getMessage() 中脱敏,别等日志进 ELK 才想起来过滤

复杂点在于:异常类本身要轻量,别在构造时查数据库或远程调用;错误码枚举要集中管理,避免散落在各个 service 里硬编码;还有,别让团队成员开始争论“该继承 Exception 还是 RuntimeException”——只要约定好“所有业务异常都继承 RuntimeException,但必须可被捕获和识别”,就比纠结检查异常更有实际价值。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

156

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

dubbo和zookeeper有什么区别
dubbo和zookeeper有什么区别

dubbo和zookeeper的区别:1、功能定位;2、使用场景;3、数据存储与协调;4、集成与关系;5、性能与可靠性;6、扩展性与灵活性;7、社区与生态系统。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2024.02.23

springcloud和dubbo有哪些区别
springcloud和dubbo有哪些区别

springcloud和dubbo的区别:1、定位与关注点;2、生态环境与集成性;3、调用方式与性能;4、组件与功能;5、定制性与灵活性;6、学习曲线与上手难度;7、社区支持与维护。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

134

2024.02.23

dubbo原理和机制是什么
dubbo原理和机制是什么

dubbo原理和机制的解释:1、核心组件;2、通信原理;3、集群容错;4、自动发现与注册;5、负载均衡与路由;6、序列化与传输;7、监控与日志;8、扩展性;9、安全性;10、与spring集成等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

109

2024.02.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号