¿Cómo puedo plantear una excepción que incluye una cadena Unicode?

Estoy escribiendo código Python 2 con cadenas Unicode, importando unicode_literals y estoy teniendo problemas al generar excepciones.

# -*- coding: utf-8 -*- from __future__ import unicode_literals raise Exception('Tést') 

Al hacer esto, la cadena ‘Tést’ se elimina de la terminal.

Puedo solucionar esto con

 raise Exception('Tést'.encode('utf-8')) 

Prefiero encontrar una solución global que tener que hacer esto en todas las declaraciones de raise Exception .

(Ya que estoy usando la función tr() PyQt en los mensajes de Excepción, se deben manejar caracteres especiales, no puedo saber en el momento de la encode('utf-8') si es necesario encode('utf-8') .

Peor. A veces, quiero capturar una excepción, obtener su mensaje y generar una nueva excepción, concatenando una cadena base con la primera cadena de excepción.

Tengo que hacerlo de esta manera:

 try: raise TypeError('Tést'.encode('utf-8')) except Exception as e: raise Exception('Exception: {}'.format(str(e).decode('utf-8')).encode('utf-8')) 

pero realmente deseo que sea menos engorroso (y este ejemplo ni siquiera incluye las llamadas self.tr() ).

¿Hay alguna forma más sencilla?

(Y como pregunta complementaria, ¿son las cosas más simples con Python3? ¿Puede Exception usar cadenas Unicode?)

Gracias a los comentarios debajo de la pregunta, se me ocurrió esto.

La idea es utilizar una subclase de excepción personalizada.

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