Python异常处理最佳实践与反模式
列举Python异常处理中的最佳实践和常见反模式。什么是裸except(except:)的风险?什么时候应该使用else子句?什么是异常处理双刃剑(Too broad vs Too narrow)?如何防止异常信息泄露安全敏感信息?异常的性能开销大吗?
回答
苦行僧
最佳实践:
✅ 具体异常类型:except ValueError:而非except:
✅ 使用else子句:将不会抛出异常的代码放入else
✅ 使用finally释放资源:文件、锁、连接等
✅ 日志保留traceback:logging.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,不会被误捕