3 votes

L'exception Python 2.7 ne gère pas l'unicode dans un code compatible avec Python3 ('<exception str() failed>')

J'essaie d'avoir un code compatible avec python2.7/3+. Et j'ai du mal à gérer correctement la levée d'une ValueError avec un message en unicode. J'ai trouvé très peu de résultats pour "exception str() failed".

Voici le code :

from __future__ import (
    absolute_import, division, print_function, unicode_literals
)

import logging

from builtins import str
from future import standard_library

standard_library.install_aliases()

conf = {}
try:
    conf["key"]
except KeyError:
    msg = "Message"
    msg += " + ünicode"
    logging.warn(msg)
    raise ValueError(msg)

Dans python3, cela fonctionne comme prévu, mais dans python 2.7 dès que msg contient l'unicode qu'il donne :

WARNING:root:Message + ünicode
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
ValueError: <exception str() failed>

Remarquez comment l'enregistrement peut gérer la chaîne unicode mais pas ValueError . Qu'est-ce que je fais de mal ? Comment puis-je avoir un message d'erreur unicode à la fois dans python 2.7 et 3+ ?

2voto

Sean Points 3950

Vous pouvez essayer d'encoder le message et de le convertir en chaîne de caractères pour Python 2, par exemple.

from sys import version_info

if version_info.major == 2:
    raise ValueError(msg.encode('utf-8'))
elif version_info.major == 3:
    raise ValueError(msg)
else:
    raise YourException("not supported Python version")

Upate : Voici la solution de contournement sans importer de paquet si vous utilisez seulement from __future__ import unicode_literals sans python-futur paquet :

if isinstance(msg, str):
   raise ValueError(msg)
else:
   raise ValueError(msg.encode('utf-8'))

Attendre un correctif au niveau du code Python (par exemple, six, futur paquet) est presque impossible car le code problématique se trouve au niveau du code C en pythonrun.c il semble que PyObject_Str(value) exécution pour une chaîne unicode retournée nulle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X