Как я могу создать исключение, которое включает строку Unicode?

Я пишу код Python 2 с строками Unicode, импортируя 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 .

(Поскольку я использую функцию tr() PyQt в сообщениях Exception, необходимо обрабатывать специальные символы, я не могу знать во время encode('utf-8') нужен ли encode('utf-8') .

Хуже. Иногда я хочу поймать Exception, получить его сообщение и поднять новое Exception, объединив базовую строку с первой строкой Exception.

Я должен сделать это так:

 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? Может ли исключение использовать строки Unicode?)

Благодаря комментариям, приведенным ниже, я придумал это.

Идея заключается в использовании пользовательского подкласса Exception.

 # -*- 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('Teét') except MyException as e: print(e.message) raise MySubException('SubException: {}'.format(e))