Adding information to an exception?

前端 未结 9 1824
-上瘾入骨i
-上瘾入骨i 2020-12-02 06:49

I want to achieve something like this:

def foo():
   try:
       raise IOError(\'Stuff \')
   except:
       raise

def bar(arg1):
    try:
       foo()
             


        
9条回答
  •  误落风尘
    2020-12-02 07:32

    Unlike previous answers, this works in the face of exceptions with really bad __str__. It does modify the type however, in order to factor out unhelpful __str__ implementations.

    I'd still like to find an additional improvement that doesn't modify the type.

    from contextlib import contextmanager
    @contextmanager
    def helpful_info():
        try:
            yield
        except Exception as e:
            class CloneException(Exception): pass
            CloneException.__name__ = type(e).__name__
            CloneException.__module___ = type(e).__module__
            helpful_message = '%s\n\nhelpful info!' % e
            import sys
            raise CloneException, helpful_message, sys.exc_traceback
    
    
    class BadException(Exception):
        def __str__(self):
            return 'wat.'
    
    with helpful_info():
        raise BadException('fooooo')
    

    The original traceback and type (name) are preserved.

    Traceback (most recent call last):
      File "re_raise.py", line 20, in 
        raise BadException('fooooo')
      File "/usr/lib64/python2.6/contextlib.py", line 34, in __exit__
        self.gen.throw(type, value, traceback)
      File "re_raise.py", line 5, in helpful_info
        yield
      File "re_raise.py", line 20, in 
        raise BadException('fooooo')
    __main__.BadException: wat.
    
    helpful info!
    

提交回复
热议问题