You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python异常转字符串时遭遇编码错误求助

解决Python 2.7 Windows下异常信息Unicode编码错误的办法

嘿,我之前在Python 2.7的Windows环境里也踩过这个坑!核心问题就是Windows默认控制台编码是ASCII,当异常里包含非ASCII字符时,直接调用str(err)会强制用ASCII编码,自然就触发错误了。给你几个靠谱的解决思路:

1. 直接获取Unicode格式的异常信息

别用str()转换,直接用unicode()函数获取异常的Unicode内容,再编码成控制台支持的格式:

try:
    # 替换成你的业务代码,比如触发带特殊字符的异常
    raise Exception(u'\uf260 这是一个测试异常')
except Exception as err:
    # 直接转为Unicode对象
    unicode_error = unicode(err)
    # Windows中文系统一般用gbk编码,也可以用sys.stdout.encoding获取当前控制台编码
    print(unicode_error.encode('gbk', errors='ignore'))

这样就能绕过str()的ASCII编码强制转换,直接拿到正确的异常文本。

2. 从异常的args属性提取信息

异常对象的args属性通常存储了原始错误信息,直接处理这个更稳妥:

import sys
try:
    raise Exception(u'\uf260 测试异常内容')
except Exception as err:
    if err.args:
        err_message = err.args[0]
        # 判断原始信息是Unicode还是字节串,分别处理
        if isinstance(err_message, unicode):
            encoded_msg = err_message.encode(sys.stdout.encoding, errors='ignore')
        else:
            # 如果是字节串,先解码成Unicode再编码
            encoded_msg = err_message.decode('utf-8').encode(sys.stdout.encoding, errors='ignore')
        print(encoded_msg)

这个方法能避免异常对象的__str__方法带来的编码问题,直接操作最原始的错误信息。

3. 临时修改全局默认编码(不推荐)

如果只是临时测试,可以在代码开头修改Python的默认编码,但这个方法可能影响其他模块的行为,不建议在正式代码里用:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

try:
    raise Exception(u'\uf260 测试异常')
except Exception as err:
    print(str(err))

另外,你可以先通过print(sys.stdout.encoding)查看当前控制台的编码,用这个编码来做最后的encode操作,显示效果会更好~

内容的提问来源于stack exchange,提问作者David I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:37:28