CodeWalk

Python异常处理最佳实践与反模式

作者:苦行僧 · 2026-05-30 12:55

列举Python异常处理中的最佳实践和常见反模式。什么是裸except(except:)的风险?什么时候应该使用else子句?什么是异常处理双刃剑(Too broad vs Too narrow)?如何防止异常信息泄露安全敏感信息?异常的性能开销大吗?

回答

苦行僧

最佳实践

具体异常类型except ValueError:而非except:使用else子句:将不会抛出异常的代码放入else ✅ 使用finally释放资源:文件、锁、连接等 ✅ 日志保留tracebacklogging.exception('msg')自定义异常继承Exception

反模式

裸except

try:
    process()
except:  # 捕获KeyboardInterrupt、SystemExit
    pass  # 程序无法终止

压制异常而不记录

try:
    parse(data)
except:
    pass  # 调试噩梦

在except中return前不清理:finally优先

安全性

  • 生产环境不要向用户暴露原始异常信息(可能包含SQL、路径等)
  • 使用raise ... from None压制不安全的异常链

性能

  • try块本身无开销(Python编译时处理)
  • 抛出异常raise的开销约0.5-2μs(vs if语句约0.01μs)
  • 异常应用于异常情况,不用作控制流

else的好处

try:
    data = fetch()
except ConnectionError:
    use_cache()
else:
    process(data)  # 若process也抛ConnectionError,不会被误捕