团队写catch必须声明有意义的异常变量(如e),禁用空catch和无意义占位符,需记录日志并保留原始堆栈,自动化工具应拦截违规行为。

团队在写 catch 时必须声明异常变量(如 e),不是为了凑语法,而是为了可读、可查、可维护。不传变量或用空 catch,等于把错误“吞掉”,后续排查成本翻倍。
必须声明有意义的异常变量名
禁止省略参数、使用无意义占位符(如 catch (Exception e123) 或 catch (Exception _))。变量名应体现类型或用途:
- 统一用小写字母 e(如
catch (IOException e))——简洁通用,团队共识强 - 多异常共用一个变量时(Java 7+ 多异常捕获),仍用 e:
catch (FileNotFoundException | SecurityException e) - 若需区分上下文(如嵌套 try),可用语义化后缀:
eIo、eDb,但需全项目统一并写入规范文档
禁止空 catch 块
只写 catch (Exception e) {} 是高危行为,等同于静默失败。Review 时必须拒绝以下写法:
-
catch (Exception e) { }(完全空白) -
catch (Exception e) { /* ignore */ }(注释掩盖问题) -
catch (Exception e) { System.out.println("error"); }(无堆栈、无上下文)
合规做法:至少记录日志(含 e.getMessage() 和 e.printStackTrace() 或更优的 logger.error("xxx", e))。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
必须保留原始异常信息
不能只打印消息而丢弃堆栈,也不能“吃掉”再抛新异常却不设 cause:
- ❌ 错误:
catch (SQLException e) { throw new ServiceException("DB error"); }(丢失原始堆栈) - ✅ 正确:
catch (SQLException e) { throw new ServiceException("DB error", e); }(链式异常保留根因) - 日志中优先调用
e.printStackTrace()或结构化日志框架的error("msg", e)方法
Checkstyle/SonarQube 可落地的检查项
靠人工 Review 容易漏,建议集成自动化规则:
- 启用 Checkstyle 的 EmptyCatchBlock 规则,拦截空 catch
- 配置 CatchParameterName,强制变量名为
e或白名单(如e,ex,exception) - SonarQube 启用规则:
S1166(异常被吞)、S2259(空 catch)、S1188(未记录异常) - 在 CI 流程中设为硬性门禁:任一违规即阻断合并

















