0

0

Java中的业务异常与技术异常分离设计_提升系统代码的可维护性

P粉602998670

P粉602998670

发布时间:2026-02-24 14:38:37

|

951人浏览过

|

来源于php中文网

原创

业务异常必须用 runtimeexception 子类,不可用 exception 及其子类;否则强制调用方处理,混淆业务逻辑与错误处理,违背“谁出错谁负责”原则。

java中的业务异常与技术异常分离设计_提升系统代码的可维护性

业务异常该用 RuntimeException 还是受检异常?

业务异常必须用 RuntimeException 子类,不能用 Exception 或其子类(如 IOException)。否则调用方被迫写一堆 try-catch 或向上抛,把业务逻辑和错误处理缠在一起,违背“谁出错谁负责”的边界原则。

常见错误现象:定义了 OrderException extends Exception,结果每个 service 方法签名都带 throws OrderException,最后 controller 里全是模板化 catch,根本没法区分是参数错、库存不足还是支付超时。

  • 业务异常只在明确的业务规则断点抛出,比如 if (order.getAmount()
  • 所有业务异常统一继承自一个基类,如 BusinessException,方便全局捕获和统一响应格式
  • 不要给业务异常塞技术细节(如堆栈、SQL语句),它只回答“为什么不能继续”——例如“优惠券已过期”,而不是“MySQL connection timeout”

技术异常怎么避免污染业务代码?

技术异常(如 SQLExceptionHttpClientErrorException)必须在最靠近资源的地方捕获并转换,绝不能让它穿透到 service 或 controller 层。

使用场景:调用第三方 HTTP 接口失败、数据库连接中断、Redis 写入超时。这些不是业务规则问题,而是基础设施不稳定,业务层不该也不需要知道重试几次、要不要降级。

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

Play.ht
Play.ht

根据文本生成多种逼真的语音

下载
  • DAO 层或 client 层 catch SQLException / RestClientException,转成对应的 DatabaseAccessExceptionThirdPartyServiceUnavailableException(二者都应是 RuntimeException 子类)
  • 转换时保留原始异常作 cause:throw new DatabaseAccessException("failed to update order status", e);,便于排查但不暴露给前端
  • 不要在 service 方法里直接 catch SQLException——这说明数据访问逻辑没封装好,DAO 层职责被架空

@ControllerAdvice 捕获时如何区分业务异常和技术异常?

全局异常处理器必须按类型分治,否则一个 @ExceptionHandler(Exception.class) 就会让所有错误返回 500,连参数校验失败都变服务器错误。

参数差异:业务异常走 4xx 状态码 + 业务提示;技术异常走 5xx + 日志告警 + 可选降级响应。

  • 单独写 @ExceptionHandler(BusinessException.class),返回 HttpStatus.BAD_REQUESTHttpStatus.CONFLICT,body 含 codemessage 字段
  • 另写 @ExceptionHandler(DatabaseAccessException.class) 等具体技术异常,记录 error 日志,返回 HttpStatus.SERVICE_UNAVAILABLE,body 中 message 固定为“系统繁忙,请稍后重试”
  • 兜底的 @ExceptionHandler(RuntimeException.class) 只捕获未分类的 RuntimeException,打 warn 日志并返回 500,防止漏掉新异常类型

日志里怎么一眼看出是业务卡点还是系统故障?

关键不是记多少条日志,而是让每条日志自带上下文标签。业务异常日志不打 ERROR 级别,技术异常不省略 traceId。

性能影响:过度打日志会拖慢高并发接口,但漏掉关键标识会让线上问题排查时间翻倍。

  • 业务异常统一用 log.warn("business rule violated: {}", e.getMessage(), e) —— warn 级别+带 message,不带堆栈(除非要调试规则逻辑)
  • 技术异常必须 log.error("db access failed, orderId={}", orderId, e) —— error 级别+关键业务字段+完整堆栈
  • 所有日志开头加 MDC 字段,如 MDC.put("traceId", request.getHeader("X-Trace-ID")),否则分布式链路一断就找不到根因

真正难的是坚持——每次加新校验、调新接口时,都要下意识问一句:这个错,是用户能改的,还是得运维上机器看的?答错一次,后续补日志、改状态码、调监控,成本就远不止加一行 throw

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

829

2023.08.22

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

829

2023.08.22

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

422

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

595

2023.08.10

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

7

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

10

2026.02.24

Go分布式服务治理与链路追踪实践
Go分布式服务治理与链路追踪实践

本专题围绕 Go 语言在分布式系统中的服务治理实践展开,系统讲解服务注册与发现、配置中心、限流熔断、灰度发布以及分布式链路追踪方案。通过完整项目示例,帮助开发者构建可观测性完善、稳定性高、易扩展的 Go 微服务架构体系,提升线上系统问题定位与运维效率。

1

2026.02.24

Python自动化测试与持续集成实战
Python自动化测试与持续集成实战

本专题聚焦 Python 在自动化测试与持续集成中的工程化实践,系统讲解测试框架选型、测试用例设计、接口自动化、测试数据管理及测试报告生成。结合 CI/CD 流水线场景,讲解如何将自动化测试融入持续集成流程,实现代码提交即自动测试,提升项目交付质量与团队协作效率。

0

2026.02.24

Java高并发系统设计与性能调优
Java高并发系统设计与性能调优

本专题围绕 Java 在高并发业务场景下的系统设计与性能调优展开,系统讲解线程模型、并发容器、锁机制、异步编程及 JVM 性能调优思路。结合真实高并发业务场景,深入分析接口限流、线程池配置、热点资源优化与系统稳定性保障方案,帮助开发者构建高性能、高可用的 Java 后端系统。

5

2026.02.24

热门下载

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

精品课程

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

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.1万人学习

Java 教程
Java 教程

共578课时 | 71.5万人学习

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

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