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

2024-04-25 18:02:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python2.7.x中引发异常,该异常在消息中包含unicode。我好像做不到。在

不支持还是不建议在error msg中包含unicode? 或者我需要看一下吗系统标准?在

 # -*- coding: utf-8 -*-
 class MyException(Exception):
  def __init__(self, value):
    self.value = value
  def __str__(self):
    return self.value
  def __repr__(self):
    return self.value
  def __unicode__(self):
    return self.value

desc = u'something bad with field \u4443'

try:
  raise MyException(desc)
except MyException as e:
  print(u'Inside try block : ' + unicode(e))

# here is what i wish to make work 
raise MyException(desc)

运行脚本将生成以下输出。 在我的尝试/除了我可以打印字符串没有问题。在

我的问题不在考虑范围之内。在

^{pr2}$

提前谢谢。在


Tags: self消息标准returnvalue系统defunicode
3条回答

这就是Python的工作原理。我相信您看到的是来自Python核心库中的traceback._some_string()。在该模块中,当堆栈跟踪完成时,该方法中的代码首先尝试使用str()转换消息,然后如果这引发异常,则使用unicode()转换消息,然后使用encode("ascii", "backslashreplace")将其转换为ascii。您得到了有效的输出,并且一切都正常工作,我猜Python正在尽最大努力将错误消息伪向下转换,这样无论平台执行它,它都会毫无问题地显示出来。这只是你角色的unicode码位。它不会发生在您的try/except块中,因为这种转换是特定于生成堆栈跟踪的机制的(例如在发生未捕获异常的情况下)。在

这种行为取决于Python版本和环境。在Python 3上,sys.stderr的字符编码错误处理程序总是'backslashreplace'

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

Python3:

^{2}$

python2

$ PYTHONIOENCODING=ascii:ignore python2 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

在我的系统上,错误信息被python2吃掉了。在

注意:在Windows上,您可以尝试:

T:\> set PYTHONIOENCODING=ascii:ignore
T:\> python raise_unicode.py

作为比较:

$ 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

在我的例子中,您的示例可以正常工作,打印出漂亮的unicode。在

但是,有时在不使用unicode字符(或使用转义/反斜杠)打印异常堆栈时会遇到很多问题。可以克服障碍并打印正常的消息。在

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

# -*- coding: utf-8 -*-
desc = u'something bad with field ¾'
raise SyntaxError(desc.encode('utf-8', 'replace'))

它将只打印截断或拧紧的消息:

^{2}$

要实际查看未更改的unicode,可以将其编码为原始字节并馈送到异常对象:

# -*- 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 ¾

如果您愿意,您可以在构造函数中执行value.encode('utf-8', 'replace'),但是除了系统异常,您必须在raise语句中执行,如示例所示。在

提示是从这里得到的:Overcoming frustration: Correctly using unicode in python2(有一个包含许多helper的大库,它们都可以被分解到上面的示例中)。在

相关问题 更多 >