异常学习笔记:为什么自定义异常后还要 throw?

目录

问题

一、核心区别

[二、为什么不能只在 catch 里写错误信息?](#二、为什么不能只在 catch 里写错误信息?)

[三、为什么要自定义异常 + throw?](#三、为什么要自定义异常 + throw?)

四、代码示例

[为什么要【自定义异常】而不是直接抛 Exception?](#为什么要【自定义异常】而不是直接抛 Exception?)

五、一句话总结

问题

异常可以直接捕获处理,为什么还要自定义异常,并且用 throw 抛出去?


一、核心区别

  • 直接 try-catch 捕获:自己处理异常,异常被 "吃掉",上层调用者不知道出错,方法会继续往下执行。

  • throw 抛出异常:主动触发异常,中断当前方法流程,把异常交给上层去处理。


二、为什么不能只在 catch 里写错误信息?

  1. 无法中断流程

    有些错误必须停止后续逻辑(如余额不足、用户不存在),不能假装正常继续执行。

  2. 上层无法感知错误

    当场捕获处理后,调用方不知道方法执行失败,会导致业务逻辑错乱。

  3. 错误无法分类

    只用通用 Exception,上层只能通过字符串判断错误,不规范、不可靠。


三、为什么要自定义异常 + throw?

  1. 语义更清晰

    系统自带异常无法表达业务错误(余额不足、权限不足、参数非法等)。

  2. 方便上层精准捕获

    可以根据不同异常类型返回不同状态码(400、403、404 等)。

  3. 符合分层架构

    • Service 层只负责抛出异常

    • Controller / 全局异常处理器统一处理并返回前端

    • 职责分离,代码更规范


四、代码示例

为什么要【自定义异常】而不是直接抛 Exception?

这才是重点!

你说:我 catch 里也能写错误信息啊。

但问题是:错误类型无法区分!

直接抛 Exception 或 RuntimeException:

java 复制代码
throw new Exception("余额不足");
throw new Exception("用户名不存在");
throw new Exception("权限不足");

上层 catch 时:

java 复制代码
try {
} catch (Exception e) {
    // 我怎么知道这是余额不足?还是权限不足?
    // 只能看消息字符串!非常脆弱!
}

自定义异常 = 给错误 "分类"

java 复制代码
throw new BalanceNotEnoughException("余额不足");
throw new UserNotFoundException("用户不存在");
throw new PermissionDeniedException("权限不足");

上层可以精准捕获

java 复制代码
try {
} catch (UserNotFoundException e) {
    // 返回 404
} catch (BalanceNotEnoughException e) {
    // 返回 400
} catch (PermissionDeniedException e) {
    // 返回 403
}

这才是企业级项目的规范。

强制中断错误流程

throw 后方法立即停止,避免脏逻辑继续执行。

五、一句话总结

  • 自定义异常:定义错误类型,让错误有明确业务含义。

  • throw:真正触发异常,把错误交给上层,中断错误流程。

  • 只捕获不抛出,会隐藏错误、无法分类、破坏业务流程。

相关推荐
何事误红尘16 小时前
全志A40i学习笔记():开发资料、启用串口
学习
for_ever_love__16 小时前
python基础语法学习: 异常的传递性
开发语言·python·学习
PC2005-cloud17 小时前
DeepSeek Harness 创建 skill 指南:结构、安装、使用
笔记·学习
YM52e17 小时前
分页查询的基石:ArkTS 为鸿蒙商品列表设计 LIMIT/OFFSET 的表
android·学习·华为·harmonyos
math_hongfan17 小时前
主从嵌套层次分明:ArkUI 订单卡片内嵌明细的鸿蒙界面
学习·华为·harmonyos
库玛西18 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
还不秃顶的计科生19 小时前
具身智能论文学习8:Octo: An Open-Source Generalist Robot Policy
人工智能·深度学习·学习·机器学习·语言模型·vla·vlm
woshihuanglaoshi19 小时前
事务加持防超卖:ArkTS 在鸿蒙里玩转 TRANSACTION 出入库
学习·华为·harmonyos
世人万千丶20 小时前
去重插入与超限淘汰:ArkTS 实现鸿蒙搜索历史的 LIMIT 艺术
运维·服务器·学习·华为·harmonyos·鸿蒙
2601_9499506321 小时前
在线练题更方便,用练题簿打造属于自己的移动题库
学习·考研·刷题·小程序推荐