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

如何在业务逻辑中合理使用异常?

星晨大大_8673

星晨大大_8673

发布时间:2026-06-08 22:36:21

|

741人浏览过

|

来源于php中文网

原创

如何在业务逻辑中合理使用异常?

在 spring boot 分层架构中,业务校验失败不应滥用异常;推荐统一返回结构化响应(如 apiresponse),仅对真正异常场景(如系统故障、非法状态)抛出异常,兼顾可读性、性能与维护性。

在 spring boot 分层架构中,业务校验失败不应滥用异常;推荐统一返回结构化响应(如 apiresponse),仅对真正异常场景(如系统故障、非法状态)抛出异常,兼顾可读性、性能与维护性。

在实际业务开发中,异常(Exception)的本质是表示“意外的、非预期的程序中断”,而非常规的业务流程分支。将 checkConditions_1() 等校验失败视为“错误”而抛出异常,本质上混淆了 业务规则拒绝(Business Rejection) 与 系统异常(System Failure) 的边界——前者是正常业务流的一部分(例如“用户名已存在”“余额不足”),后者才是需中断执行、记录日志、触发告警的真正异常(例如数据库连接超时、空指针、JSON 解析失败)。

因此,合理做法是:
✅ 对可预见的业务校验失败,统一返回结构化响应对象(如 ApiResponse),由 Controller 层转换为标准 HTTP 状态码(如 400 Bad Request)和语义化 JSON;
❌ 避免为业务规则拦截随意抛出运行时异常——这不仅带来 JVM 异常栈创建/捕获的性能开销(尤其高频调用场景),更会掩盖真实问题(如本该报 NPE 却被业务异常吞掉),且使调用方难以区分“用户输入错误”和“服务内部崩溃”。

以下是一个推荐实践示例:

// 统一响应封装(支持泛型数据)
public class ApiResponse<T> {
    private boolean success;
    private String message;
    private T data;
    private int code; // 可选:自定义业务码,如 1001=用户名重复

    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(true, "操作成功", data, 200);
    }

    public static ApiResponse<Void> fail(String message, int code) {
        return new ApiResponse<>(false, message, null, code);
    }

    // 构造器与 getter/setter 略
}
@Service
public class BusinessService {
    public ApiResponse<String> business() {
        if (!checkConditions_1()) {
            return ApiResponse.fail("条件1不满足:用户未登录或权限不足", 403);
        }
        if (!checkConditions_2()) {
            return ApiResponse.fail("条件2不满足:库存不足", 400);
        }
        if (!checkConditions_3()) {
            return ApiResponse.fail("条件3不满足:订单已过期", 410);
        }
        // 执行核心业务逻辑
        String result = doActualWork();
        return ApiResponse.success(result);
    }
}
@RestController
public class Controller {
    @GetMapping("/test")
    public ResponseEntity<ApiResponse<String>> testController() {
        ApiResponse<String> response = service.business();
        return ResponseEntity
                .status(response.getCode()) // 动态设置 HTTP 状态码
                .body(response);
    }
}

⚠️ 关键注意事项:

  • 不要用异常替代返回值:return null 确实无法传递失败原因,但正确解法是返回 ApiResponse,而非妥协为 null 或滥用异常;
  • 自定义异常仍有价值,但需严格限定场景:例如封装 UserAlreadyExistException 用于全局异常处理器(@ControllerAdvice)统一拦截并转为 ApiResponse,此时异常是通知机制,而非业务判断逻辑;
  • 参考规范:《Clean Code》强调“异常应保留给真正例外的情况”;Spring 官方推荐在 Service 层保持“无异常契约”,将异常处理收敛至 Web 层或全局切面;阿里巴巴《Java 开发手册》明确指出:“【强制】禁止在业务代码中使用 RuntimeException 包装业务校验失败”。

总结:以 清晰语义 > 性能微优化 > 框架惯性 为优先级。用 ApiResponse 显式表达业务结果,让 Controller 掌握 HTTP 状态决策权,让 Service 专注逻辑本身——这才是分层架构下异常使用的真正“合理性”。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

PixTV
PixTV Hot

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

豆包大模型

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

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

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

WorkBuddy

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

11357

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

8462

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7292

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1204

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

988

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1456

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2989

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20251

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发APP接口项目实战
PHP开发APP接口项目实战

共20课时 | 3.5万人学习

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

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