最有效方式是启用ESLint的no-fallthrough规则并设为"error",配合编辑器实时提示;辅以显式终结(return/break/throw)、规范注释、对象映射或现代switch表达式替代传统写法。

直接加 break 是最常见解法,但真正有效的处理方式是建立可落地的防御机制,而不是靠每次手动补漏。
用 ESLint 自动拦截未终结的 case
ESLint 的 no-fallthrough 规则能识别所有未用 break、return、throw 或 continue 终止的 case。它默认允许显式注释(如 // fallthrough)标记有意穿透,既防误漏,又保灵活性。
- 在项目配置中启用:
"no-fallthrough": "error" - 编辑器(如 VS Code)装 ESLint 插件,保存即提示,比人工检查快且准
- 注释必须写在 case 行末或下一行开头,格式要规范,否则工具不认
把每个 case 当作独立函数来收尾
心理上预设“这个分支必须有出口”,自然会关注终结动作。比起纠结 break 放哪,不如统一用 return(函数内)、throw 或 break 显式收束。
- 函数中优先用
return:简洁,天然阻断穿透,还避免后续代码干扰 - 空 case 也不能留白:哪怕暂时没逻辑,也写
break或throw new Error("unhandled") - 若需共用后续逻辑,显式写
break并加注释说明意图,例如:// shared cleanup logic
用对象映射或 match 表达式替代长 switch
当 switch 只做值匹配并返回结果或调用函数时,查找表或现代语法能彻底绕过 break 风险。
- JavaScript 中:
const handlers = { 'start': startAction, 'stop': stopAction };,然后handlers[cmd]?.() - Java 14+ 推荐 switch 表达式(
->语法):默认不穿透,自动终止,支持直接赋值 - PHP 8+ 用
match:强制返回值、严格比较、无隐式穿透,未匹配抛异常,安全边界更清晰
代码审查时盯紧两个信号点
人工走查不用通读逻辑,聚焦两个关键位置即可快速发现风险:
- 滚动查看每个 case 块最后一行:是
break、return、throw,还是直接花括号闭合? - 检查
default是否存在且非空;即使当前无处理逻辑,也建议写default: throw new Error("unexpected value"); - 特别注意 case 后紧跟
if或循环的情况——块末尾是否已终结,容易被忽略


















