traceback.format_exc() 是获取当前异常完整多行字符串的最直接方法,返回含类型、消息、文件位置及调用栈的格式化文本,须在 except 块中调用,末尾自带换行。
Python 中
是最直接的多行异常字符串
想把异常变成带换行、缩进、堆栈的可读字符串,不用自己拼接。
标准库
的
模块专干这事:
会捕获当前异常(即
的内容),返回完整多行字符串,包含异常类型、消息、文件位置和每层调用栈。
常见错误是直接用
或
——它们只输出异常消息或简单对象表示,完全不带堆栈。
必须在
块内调用,否则返回空字符串
若需格式化特定异常对象(非当前活跃异常),用
返回值末尾自带换行,打印时注意别额外加
导致空行
用
自动记录多行异常日志
如果目标是写入日志而非拼字符串,
比手动调用
更稳妥。它等价于
,自动附加完整堆栈,且兼容各种 handler(如文件、SysLog)。
容易忽略的是:它只在
块中生效;若在
或函数末尾调用,
已丢失,只会打空堆栈。
无需 import
,减少依赖
日志级别固定为 ERROR,不能改成 WARNING 或 INFO
若需自定义前缀消息,传入第一个参数,例如:
自定义格式时慎用
默认输出到
,不是返回字符串——这常被误当成“能直接拿到多行文本”的方法。它没有返回值(返回
),直接 print 会导致无法赋值、拼接或控制输出目标。
Docker Sandbox
创建并管理 Docker 沙箱虚拟机环境以安全执行代理。适用于运行不受信任代码、探索包或隔离代理工作负载。支持 Claude、Codex、Copilot、Gemini 和 Kiro 代理,并提供网络代理控制。
下载
正确做法是:需要字符串就选
;需要重定向输出(比如写入 StringIO 或网络流)再用
。
参数必须是类文件对象,支持
方法
在 Jupyter 中它会显示在输出区,但返回值仍是
,不能用于后续处理
性能上,
和
开销接近,但前者少了内存拷贝
跨平台换行与
编码
要注意
和
生成的多行字符串内部统一用
分隔,不管
操作系统
。但写入文件或网络时,若目标环境要求
(如 Windows 记事本),得手动替换或用
控制。
更隐蔽的问题是编码:异常消息可能含非 ASCII 字符(如中文路径、用户输入),
返回
,但写入文件时若没指定
,可能触发
。
写文件务必显式声明编码:
不要依赖系统默认编码,尤其在 Docker 容器或 CI 环境中,
可能是 C
若需 JSON 序列化该字符串,注意
会被转义,不影响可读性,但体积略增
异常多行字符串的核心就两件事:用对函数(
而非
),管住输出端(编码、换行、目标流)。其他包装逻辑都是枝节。
traceback.format_exc()tracebacktraceback.format_exc()sys.exc_info()str(e)repr(e)excepttraceback.format_exception(type, value, tb)\nlogging.exception()logging.exception()format_exc()logger.error(..., exc_info=True)exceptfinallyexc_infotracebacklogging.exception("处理用户请求时失败")traceback.print_exc()traceback.print_exc()sys.stderrNoneformat_exc()print_exc(file=...)filewrite()Noneprint_exc()format_exc()\nencoding\n\r\nopen(..., newline='') format_exc()strencoding='utf-8'UnicodeEncodeErrorwith open('err.log', 'w', encoding='utf-8') as f: f.write(traceback.format_exc())locale\nformat_excstr