首页 > 解决方案 > 如何在没有堆栈跟踪的情况下创建 Python 异常?

问题描述

我想创建一个不打印堆栈跟踪的 Python 异常(对于简单的用户错误)。我在下面创建了一个包装自定义类的函数,但我更愿意将它直接烘焙到自定义异常类中,这可能吗?

class UserError(Exception):
    pass

def throw_user_error(s_msg):
    sys.tracebacklimit = 0
    raise UserError(s_msg)
    sys.tracebacklimit = 1000

标签: pythonexceptionerror-handling

解决方案


为此,您应该创建自定义处理程序,而不是异常。这个处理程序甚至已经存在于标准库中:例如:

class CustomException(Exception):
    pass

from contextlib import suppress

def main():
    with suppress(CustomException):
        # throw this error without consequences
        raise CustomException() 
        print('This won\'t be reached')   
    print('Exiting normally anyway')

main()    

Exiting normally anyway

隐藏回溯的一种更有效的方法是替换它:

In [30]: def fn(n=0):
    ...:     if n <= 0:
    ...:         raise Exception
    ...:     return fn(n-1)
    ...:
    ...: try:
    ...:     fn(10)
    ...: except Exception as e:
    ...:     raise e.with_traceback(None)
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-30-bc3c4e86e3cc> in <module>
      7     fn(10)
      8 except Exception as e:
----> 9     raise e.with_traceback(None)

Exception:

如果没有这条线(信不信由你),如果我们进一步传播异常,我们将看到长长的递归调用堆栈。


推荐阅读