【问题标题】:Convert exception to unicode in Python 2.7在 Python 2.7 中将异常转换为 unicode
【发布时间】:2018-07-20 07:28:49
【问题描述】:

在旧代码中,原始异常被变量 exc 捕获:

  File "/usr/lib64/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
URLError: <urlopen error [Errno 32] Datenübergabe unterbrochen (broken pipe)>

我想使用unicode(exc),但失败了:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 31:
                     ordinal not in range(128)

如何从异常 exc 创建一个 unicode 字符串?

环境:Python 2.7

【问题讨论】:

  • 你不应该在 2018 年用 Python 2 编写新代码。
  • @tripleee 你比我知道的多。你知道上面的代码是什么时候写的吗?我没有。
  • 显然,维护 Python 2 代码仍将是一件很长一段时间内的事情。不过,您的问题看起来像是您正在尝试实际开发 Python 2 代码。
  • @tripleee 谢谢你的提示。我更新了问题。现在是正确的吗?

标签: python python-2.7 python-unicode


【解决方案1】:

这个

unicode(exc)

失败是因为exc 的类型为URLError,如果你尝试对其进行字符串操作(比如转换为Unicode),Python 会进行隐式字符串转换,并且它假定的编码是'ascii'。要执行您想要的操作,您必须自己从异常中取出字符串,并提供您想要的编码,如下所示:

unicode(exc.reason, encoding='Latin-1')

对于适用于其他类型异常的解决方案,请单独解码元组 exc.args 的成员:

", ".join(unicode(a, encoding='Latin-1') for a in exc.args)

没有通用的方法可以判断args 的哪个成员是您真正想看到的,但通常是第一个。

【讨论】:

  • 如果我尝试使用不同的异常,我会得到一个 AttributeError,因为该异常没有属性“原因”。
  • 已编辑以考虑扩大的问题。
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 2018-07-12
  • 2018-03-07
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多