try:
    run()
except Exception as exc:
    err = traceback.format_exc()
print(err)

在 except 里存的异常变量,出代码块再引用抛 UnboundLocalError。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,Python 3 在 except 结束时会把异常名从局部命名空间删掉,避免异常对象和堆栈互相引用导致内存无法回收。

这次卡住的地方就在「except 变量作用域」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。

处理上按这个顺序:在 except 块内就取出需要的文本另存;用堆栈格式化函数把完整的异常信息保存成字符串;确实要保留异常对象,就换一个变量名接住它。

改完只确认一件事:日志里能看到完整堆栈,代码块外引用不再报变量未定义。

作者 9823189