##// END OF EJS Templates
Protect zmqshell against non-unicode safe exceptions....
Thomas Kluyver -
Show More
@@ -40,6 +40,7 b' from IPython.testing.skipdoctest import skip_doctest'
40 from IPython.utils import io
40 from IPython.utils import io
41 from IPython.utils.jsonutil import json_clean
41 from IPython.utils.jsonutil import json_clean
42 from IPython.utils.process import arg_split
42 from IPython.utils.process import arg_split
43 from IPython.utils import py3compat
43 from IPython.utils.traitlets import Instance, Type, Dict, CBool, CBytes
44 from IPython.utils.traitlets import Instance, Type, Dict, CBool, CBytes
44 from IPython.utils.warn import warn, error
45 from IPython.utils.warn import warn, error
45 from IPython.zmq.displayhook import ZMQShellDisplayHook, _encode_binary
46 from IPython.zmq.displayhook import ZMQShellDisplayHook, _encode_binary
@@ -436,6 +437,27 b' class KernelMagics(Magics):'
436 error("Could not start qtconsole: %r" % e)
437 error("Could not start qtconsole: %r" % e)
437 return
438 return
438
439
440 def safe_unicode(e):
441 """unicode(e) with various fallbacks. Used for exceptions, which may not be
442 safe to call unicode() on.
443 """
444 try:
445 return unicode(e)
446 except UnicodeError:
447 pass
448
449 try:
450 return py3compat.str_to_unicode(str(e))
451 except UnicodeError:
452 pass
453
454 try:
455 return py3compat.str_to_unicode(repr(e))
456 except UnicodeError:
457 pass
458
459 return u'Unrecoverably corrupt evalue'
460
439
461
440 class ZMQInteractiveShell(InteractiveShell):
462 class ZMQInteractiveShell(InteractiveShell):
441 """A subclass of InteractiveShell for ZMQ."""
463 """A subclass of InteractiveShell for ZMQ."""
@@ -514,7 +536,7 b' class ZMQInteractiveShell(InteractiveShell):'
514 exc_content = {
536 exc_content = {
515 u'traceback' : stb,
537 u'traceback' : stb,
516 u'ename' : unicode(etype.__name__),
538 u'ename' : unicode(etype.__name__),
517 u'evalue' : unicode(evalue)
539 u'evalue' : safe_unicode(evalue)
518 }
540 }
519
541
520 dh = self.displayhook
542 dh = self.displayhook
General Comments 0
You need to be logged in to leave comments. Login now