0

0

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

P粉602998670

P粉602998670

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

|

984人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

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

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

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

传声港
传声港

AI驱动的综合媒体服务平台,提供 “媒体发稿 + 自媒体宣发 + 效果监测” 一站式服务

下载
  • 受检异常(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工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

351

2023.10.18

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

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

326

2023.10.25

登录token无效
登录token无效

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

6362

2023.09.14

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

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

831

2023.09.14

token怎么获取
token怎么获取

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

1079

2023.12.21

token什么意思
token什么意思

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

1527

2024.03.01

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

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

410

2023.07.18

堆和栈区别
堆和栈区别

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

587

2023.08.10

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

4

2026.02.12

热门下载

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

精品课程

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

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.1万人学习

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

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