应只捕获具体异常类型,如filenotfoundexception、sqltimeoutexception等,禁用catch(exception e);通过ide检查、spotbugs、阿里插件强制约束;全局异常由@controlleradvice分层处理,保底记录完整堆栈;前置校验和try-with-resources减少异常发生。

避免宽泛捕获 Exception,核心是让异常处理回归语义——只响应你真正能理解、能干预、该负责的异常类型,而不是用一把大网兜住所有意外。
只捕获明确可能抛出的具体异常
Java 编译器已通过受检异常(如 IOException、SQLException)告诉你哪些异常必须处理;运行时异常(如 IllegalArgumentException、NullPointerException)则反映逻辑缺陷或非法输入。二者都不该被 catch (Exception e) 一锅端。
- 文件读取操作,应分别处理
FileNotFoundException(路径错误)、SecurityException(权限不足)、IOException(磁盘满/网络中断),而非笼统捕获Exception - 数据库查询,优先捕获
SQLTimeoutException(可重试)、SQLSyntaxErrorException(属 SQL 写错,需修复代码),而不是吞掉所有SQLException子类 - 参数校验失败,直接抛
IllegalArgumentException或自定义业务异常(如InvalidOrderStatusException),调用方应主动预防,而非靠上层兜底
禁用 Exception/Throwable 捕获的工程化约束
靠人记容易漏,靠工具才能落地。把宽泛捕获变成“编译不过”或“CI 失败”,比写注释管用得多。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 IntelliJ 中启用 inspections:勾选 “Catch Exception” 和 “Catch Throwable”,设为 Error 级别,保存即报红
- Maven 项目集成 SpotBugs,配置规则
REC_CATCH_EXCEPTION和THROWABLE_INSTANCEOF,构建时自动拦截 - 安装阿里巴巴 Java 开发手册插件,它会直接标出所有
catch (Exception e)并提示“应捕获具体异常类型”
兜底逻辑必须上移到统一入口
业务方法不是异常收容所。service、dao、util 层出现 catch (Exception e) 是设计信号——说明职责混乱或异常传播路径不清晰。
- 全局异常处理交给框架层:Spring Boot 用
@ControllerAdvice,按@ExceptionHandler(FileNotFoundException.class)→@ExceptionHandler(IOException.class)→ 最后才用@ExceptionHandler(Exception.class)做保底 - 保底 handler 必须记录完整堆栈:
logger.error("未预期异常", e),绝不能只打e.getMessage()或空 catch - main 方法或独立线程中兜底,仅用于防止进程退出,且要立即记录 + 快速失败,不可尝试“恢复”
用前置校验和 try-with-resources 减少异常发生
很多 Exception 捕获,本质是没把防御做在前面。减少异常发生,比捕获后再处理更高效、更健壮。
- 对入参做快速校验:如
Objects.requireNonNull(config, "config must not be null"),提前暴露 NPE,不留给运行时 - 用
try-with-resources自动管理资源,避免因手动close()抛出的IOException干扰主逻辑 - 对可预期的失败场景(如远程调用超时),用熔断、降级、重试等机制替代异常捕获,把“异常流”转为“控制流”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










