diff --git a/IPython/zmq/zmqshell.py b/IPython/zmq/zmqshell.py index 5be8f54..aedce0e 100644 --- a/IPython/zmq/zmqshell.py +++ b/IPython/zmq/zmqshell.py @@ -40,6 +40,7 @@ from IPython.testing.skipdoctest import skip_doctest from IPython.utils import io from IPython.utils.jsonutil import json_clean from IPython.utils.process import arg_split +from IPython.utils import py3compat from IPython.utils.traitlets import Instance, Type, Dict, CBool, CBytes from IPython.utils.warn import warn, error from IPython.zmq.displayhook import ZMQShellDisplayHook, _encode_binary @@ -436,6 +437,27 @@ class KernelMagics(Magics): error("Could not start qtconsole: %r" % e) return +def safe_unicode(e): + """unicode(e) with various fallbacks. Used for exceptions, which may not be + safe to call unicode() on. + """ + try: + return unicode(e) + except UnicodeError: + pass + + try: + return py3compat.str_to_unicode(str(e)) + except UnicodeError: + pass + + try: + return py3compat.str_to_unicode(repr(e)) + except UnicodeError: + pass + + return u'Unrecoverably corrupt evalue' + class ZMQInteractiveShell(InteractiveShell): """A subclass of InteractiveShell for ZMQ.""" @@ -514,7 +536,7 @@ class ZMQInteractiveShell(InteractiveShell): exc_content = { u'traceback' : stb, u'ename' : unicode(etype.__name__), - u'evalue' : unicode(evalue) + u'evalue' : safe_unicode(evalue) } dh = self.displayhook