应将 try-catch 置于循环体内而非包裹整个循环,确保单次迭代异常不影响其余执行;java 用 try-with-resources、python 用 with 管理资源;避免空 catch,需分类捕获并记录日志;continue 非必需,仅当需跳过当前轮次剩余逻辑时显式使用。

把 try-catch 放进循环体内部,而不是包住整个循环。这样某次迭代出错,只影响当前轮次,其余迭代照常执行。
Java 中的关键写法
错误写法:整个 for 循环被 try 包裹 → 一旦异常抛出,循环立刻终止。
正确写法:每次迭代都有一套独立的 try-catch 作用域。
- 异常发生在 try 块中 → 进入对应 catch → 执行完后自动进入下一次迭代
- 不需要显式写
continue,除非你想跳过当前轮次中 try 块之后的剩余逻辑 - 避免空
catch,至少记录日志(如logger.warn("处理 {} 失败", item, e)) - 对常见异常分类捕获,比如
NumberFormatException、IOException,便于针对性处理
Python 中的等效做法
同样要把 try-except 放在 for 循环体内,且需注意“吞掉异常”的位置是否合理。
- 如果函数
f1()内部用except: pass,异常被静默吃掉 → 后续f2()、f3()仍会执行,无法实现“立即跳出本轮” - 正确方式是把整组操作(如
f1(); f2(); f3())放在外层try中,except里加continue - 示例:
for item in data: try: process(item); save(item) except ValueError: log.warn(...); continue
别忽略资源和状态安全
循环中若涉及文件、连接、流等资源,异常不能导致泄漏。
- 优先用
try-with-resources(Java)或with open(...)(Python)自动释放 - 手动管理时,
close()要放在finally或独立的 try-catch 中 - 避免在
catch中修改共享变量(如计数器、集合)却不加同步,尤其在多线程场景下
要不要显式写 continue?
多数情况下不用。try-catch 在循环体内自然结束,就会进入下一轮迭代。
- 只有当你在 try 块中做了部分操作,又想跳过后续语句时,才加
continue - 例如:解析 JSON 成功后要存库,失败则跳过存储逻辑,直接进下一轮
- 写
continue是为了逻辑清晰,不是功能必需











