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
相关产品推荐
相关产品推荐

