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

异常处理总结:从捕获语法到设计哲学的高质量Java代码进阶

雨伟小哥_3216

雨伟小哥_3216

发布时间:2026-02-12 15:01:43

|

1004人浏览过

|

来源于php中文网

原创

Java中try-catch应只包裹明确可能抛异常且能处理的代码,避免过大或过小;受检异常必须处理,非受检异常慎用throws;日志需用SLF4J记录完整上下文并脱敏;自定义异常依是否强制调用方处理选择继承Exception或RuntimeException。

异常处理总结:从捕获语法到设计哲学的高质量java代码进阶

Java中try-catch到底该包多大范围?

包太小,异常漏捕获;包太大,逻辑耦合、掩盖真实问题。关键不是“要不要包”,而是“包哪几行——且只包那些真正可能抛出异常、且你有能力处理的代码”。

常见错误现象:NullPointerException在catch块里被吞掉,日志没打,上层完全不知道调用失败;或者把整个方法体塞进try,结果IOException和IllegalArgumentException混在一起处理,语义全乱。

  • 只包裹明确会抛受检异常(IOException、SQLException)或你主动预期的非受检异常(如JsonProcessingException)的调用点
  • 避免包裹纯计算逻辑(比如Math.abs(x)、list.size()),它们不会抛异常,加try纯属干扰阅读
  • 如果调用链里多个步骤都可能抛同类型异常(如连续读三个文件),优先拆成独立try-catch,便于定位具体哪一步失败

什么时候该用throws而不是try-catch?

不是所有异常都要当场处理。把异常往外推,是分层协作的基础——让更上层、更了解业务上下文的代码决定怎么应对。

使用场景:DAO层读数据库失败,抛SQLException;Service层不自己重试或降级,而是声明throws ServiceException;Controller层才决定返回500还是兜底数据。

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

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • 受检异常(Exception子类但非RuntimeException)必须显式处理,要么catch,要么throws——别用catch空吞再throw new RuntimeException(e)来绕过
  • 非受检异常(RuntimeException及其子类)原则上不该在方法签名写throws,除非是自定义业务异常(如InsufficientBalanceException),且你希望调用方明确感知
  • 注意JDK 7+的AutoCloseable资源自动关闭机制,try-with-resources里的资源声明本身就会隐式throws,别重复写

catch块里只写e.printStackTrace()有多危险?

它把堆栈输出到System.err,而生产环境通常重定向或忽略这个流——等于什么都没留。更糟的是,它掩盖了异常类型和上下文,调试时只剩一句“出错了”,毫无线索。

性能影响:频繁调用printStackTrace()会触发Throwable.fillInStackTrace(),开销不小;而日志框架(如SLF4J)默认懒加载堆栈,更轻量。

  • 统一用日志框架记录,例如:log.error("Failed to parse config file", e)
  • 不要只记异常名(e.getClass().getName()),要带原始消息和完整堆栈
  • 敏感信息(如密码、token)不能出现在日志里——捕获后先脱敏再记录,或用log.error("Auth failed, user: {}", userId)代替拼接完整异常消息

自定义异常该继承RuntimeException还是Exception?

取决于你是否想强制调用方处理它。Java的设计本意很清晰:受检异常用于“程序本可预见、且调用方大概率需要干预”的场景(如文件不存在);非受检异常用于“程序缺陷或不可恢复的错误”(如空指针、数组越界)。

容易踩的坑:把所有自定义异常都设为受检,结果满屏throws,反而让真正重要的异常信号被淹没。

  • 业务异常(如OrderAlreadyShippedException)建议继承RuntimeException——它是业务规则违反,不是IO或配置错误,调用方不处理也应让流程失败暴露问题
  • 只有当你确定某类异常**必须被上层显式决策**(比如支付超时,要走人工复核流程),才设计为受检异常
  • 无论哪种,都提供含参构造函数,支持传入cause,保证异常链不断:`super("Invalid payment method", cause)`

真正难的不是语法,是判断“这个异常,此刻该由谁、以什么方式响应”。写catch前,先问一句:我在这里能做比抛出去更有价值的事吗?

热门AI工具

更多
立刻MV
立刻MV Hot

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

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

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

WorkBuddy

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

豆包大模型

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

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

AionClaw
AionClaw Hot

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

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

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

1009

2023.10.18

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

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

3180

2023.10.25

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

14466

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1705

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

3997

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

6161

2024.03.01

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

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

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

6307

2023.07.18

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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