如何引发包含 Unicode 字符串的异常?
How can I raise an Exception that includes a Unicode string?
我正在用 Unicode 字符串编写 Python 2 代码,导入 unicode_literals 并且我遇到了引发异常的问题。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
raise Exception('Tést')
执行此操作时,'Tést' 字符串会从终端剥离。
我可以通过
解决这个问题
raise Exception('Tést'.encode('utf-8'))
我宁愿找到一个全局解决方案,也不愿在所有 raise Exception
语句中都这样做。
(由于我在异常消息中使用了PyQt的tr()
函数,所以必须处理特殊字符,我在编码时不知道是否需要encode('utf-8')
。)
更糟。有时,我想捕获一个异常,获取它的消息,并引发一个新的异常,将一个基本字符串与第一个异常字符串连接起来。
我必须这样做:
try:
raise TypeError('Tést'.encode('utf-8'))
except Exception as e:
raise Exception('Exception: {}'.format(str(e).decode('utf-8')).encode('utf-8'))
但我真的希望它能不那么麻烦(这个例子甚至不包括 self.tr()
调用)。
有没有更简单的方法?
(附带一个问题,使用 Python3 会更简单吗?Exception 可以使用 unicode 字符串吗?)
感谢问题下方的评论,我想到了这个。
想法是使用自定义异常子类。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
class MyException(Exception):
def __init__(self, message):
if isinstance(message, unicode):
super(MyException, self).__init__(message.encode('utf-8'))
self.message = message
elif isinstance(message, str):
super(MyException, self).__init__(message)
self.message = message.decode('utf-8')
# This shouldn't happen...
else:
raise TypeError
def __unicode__(self):
return self.message
class MySubException(MyException):
pass
try:
raise MyException('Tést')
except MyException as e:
print(e.message)
raise MySubException('SubException: {}'.format(e))
我正在用 Unicode 字符串编写 Python 2 代码,导入 unicode_literals 并且我遇到了引发异常的问题。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
raise Exception('Tést')
执行此操作时,'Tést' 字符串会从终端剥离。
我可以通过
解决这个问题raise Exception('Tést'.encode('utf-8'))
我宁愿找到一个全局解决方案,也不愿在所有 raise Exception
语句中都这样做。
(由于我在异常消息中使用了PyQt的tr()
函数,所以必须处理特殊字符,我在编码时不知道是否需要encode('utf-8')
。)
更糟。有时,我想捕获一个异常,获取它的消息,并引发一个新的异常,将一个基本字符串与第一个异常字符串连接起来。
我必须这样做:
try:
raise TypeError('Tést'.encode('utf-8'))
except Exception as e:
raise Exception('Exception: {}'.format(str(e).decode('utf-8')).encode('utf-8'))
但我真的希望它能不那么麻烦(这个例子甚至不包括 self.tr()
调用)。
有没有更简单的方法?
(附带一个问题,使用 Python3 会更简单吗?Exception 可以使用 unicode 字符串吗?)
感谢问题下方的评论,我想到了这个。
想法是使用自定义异常子类。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
class MyException(Exception):
def __init__(self, message):
if isinstance(message, unicode):
super(MyException, self).__init__(message.encode('utf-8'))
self.message = message
elif isinstance(message, str):
super(MyException, self).__init__(message)
self.message = message.decode('utf-8')
# This shouldn't happen...
else:
raise TypeError
def __unicode__(self):
return self.message
class MySubException(MyException):
pass
try:
raise MyException('Tést')
except MyException as e:
print(e.message)
raise MySubException('SubException: {}'.format(e))