在python 2中是否可能引发包含非英语字符的异常?

在python 2中是否可能引发包含非英语字符的异常?,python,exception,unicode,non-english,Python,Exception,Unicode,Non English,我试图在Python2.7.x中引发异常,它在消息中包含unicode。我似乎无法让它工作 错误消息中是否不支持或不建议包含unicode? 或者我需要查看sys.stderr吗 #-*-编码:utf-8-*- 类MyException(异常): 定义初始值(自身,值): 自我价值=价值 定义(自我): 回归自我价值 定义报告(自我): 回归自我价值 def ___; unicode(自): 回归自我价值 desc=u'字段有问题\u4443' 尝试: 引发MyException(描述) 除了我

我试图在Python2.7.x中引发异常,它在消息中包含unicode。我似乎无法让它工作

错误消息中是否不支持或不建议包含unicode? 或者我需要查看sys.stderr吗

#-*-编码:utf-8-*-
类MyException(异常):
定义初始值(自身,值):
自我价值=价值
定义(自我):
回归自我价值
定义报告(自我):
回归自我价值
def ___; unicode(自):
回归自我价值
desc=u'字段有问题\u4443'
尝试:
引发MyException(描述)
除了我的例外情况e:
打印(u'内试块:'+unicode(e))
#这就是我希望让工作成功的原因
引发MyException(描述)
运行脚本将生成以下输出。 在我的try/except中,我可以毫无问题地打印字符串

我的问题不在尝试范围之内

内部try块:字段有问题䑃
回溯(最近一次呼叫最后一次):
文件“C:\Python27\lib\bdb.py”,第387行,正在运行
全局、局部中的exec cmd
文件“C:\Users\ghis3080\r.py”,第25行,在
引发MyException(描述)
MyException:字段有问题\u4443

提前感谢。

这就是Python的工作原理。我相信您看到的是来自Python核心库中的
回溯。在该模块中,当堆栈跟踪完成时,该方法中的代码首先尝试使用
str()
转换消息,然后如果引发异常,则使用
unicode()
转换消息,然后使用
encode(“ascii”,“反斜杠替换”)
将其转换为ascii。您得到了有效的输出,并且一切都正常工作,我的猜测是Python正在尽最大努力对错误消息进行伪下变频,以便无论平台如何执行它,它都能毫无问题地显示出来。这只是字符的unicode代码点。它不会发生在
try/except
块中,因为这种转换是特定于生成堆栈跟踪的机制的(例如在发生未捕获异常的情况下)。

该行为取决于Python版本和环境。在Python3上,
sys.stderr
的字符编码错误处理程序总是
“反斜杠替换”

from __future__ import unicode_literals, print_function
import sys

s = 'unicode "\u2323" smile'
print(s)
print(s, file=sys.stderr)
try:
    raise RuntimeError(s)
except Exception as e:
    print(e.args[0])
    print(e.args[0], file=sys.stderr)
    raise
蟒蛇3:

$ PYTHONIOENCODING=ascii:ignore python3 raise_unicode.py
unicode "" smile
unicode "\u2323" smile
unicode "" smile
unicode "\u2323" smile
Traceback (most recent call last):
  File "raise_unicode.py", line 8, in <module>
    raise RuntimeError(s)
RuntimeError: unicode "\u2323" smile
作为比较:

$ python3 raise_unicode.py
unicode "⌣" smile
unicode "⌣" smile
unicode "⌣" smile
unicode "⌣" smile
Traceback (most recent call last):
  File "raise_unicode.py", line 8, in <module>
    raise RuntimeError(s)
RuntimeError: unicode "⌣" smile
$python3 raise\u unicode.py
unicode“⌣" 微笑
unicode“⌣“微笑
unicode“⌣“微笑
unicode“⌣“微笑
回溯(最近一次呼叫最后一次):
文件“raise_unicode.py”,第8行,在
引发运行时错误
运行时错误:unicode“⌣“微笑

在我的例子中,您的示例工作正常,打印了漂亮的unicode

但有时,如果打印的异常堆栈没有(或使用转义/反斜杠)unicode字符,则会出现很多问题。可以克服此障碍并打印正常消息

输出问题示例(Python 2.7,linux):

它将只打印截断或扭曲的消息:

~/.../sources/C_patch$ python SO.py 
Traceback (most recent call last):
  File "SO.py", line 25, in <module>
    raise SyntaxError(desc)
SyntaxError
这一次,您将看到完整的消息:

~/.../sources/C_patch$ python SO.py 
Traceback (most recent call last):
  File "SO.py", line 3, in <module>
    raise SyntaxError(desc.encode('utf-8', 'replace'))
SyntaxError: something bad with field ¾
~/…/sources/C\u补丁$python SO.py
回溯(最近一次呼叫最后一次):
文件“SO.py”,第3行,在
raise SYNTEXERROR(描述编码('utf-8','replace'))
SyntaxError:字段¾有问题
如果愿意,您可以在构造函数中执行
value.encode('utf-8','replace')
,但如果出现系统异常,您必须在
raise
语句中执行,如示例中所示

这里给出了一些提示:(有一个包含许多帮助程序的大型库,它们都可以简化为上面的示例)。

.encode('utf-8')确实帮助了我,我甚至不必使用第二个参数。与。
# -*- coding: utf-8 -*-
desc = u'something bad with field ¾'
raise SyntaxError(desc.encode('utf-8', 'replace'))
~/.../sources/C_patch$ python SO.py 
Traceback (most recent call last):
  File "SO.py", line 25, in <module>
    raise SyntaxError(desc)
SyntaxError
# -*- coding: utf-8 -*-
desc = u'something bad with field ¾'
raise SyntaxError(desc.encode('utf-8', 'replace'))
~/.../sources/C_patch$ python SO.py 
Traceback (most recent call last):
  File "SO.py", line 3, in <module>
    raise SyntaxError(desc.encode('utf-8', 'replace'))
SyntaxError: something bad with field ¾