【问题标题】:How to create Python exception without stack trace?如何在没有堆栈跟踪的情况下创建 Python 异常?
【发布时间】:2021-04-04 07:37:55
【问题描述】:

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

class UserError(Exception):
    pass

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

【问题讨论】:

  • 这听起来像是一个应该由你自己的错误处理和报告代码来处理的工作,而不是由异常类来处理。
  • 尝试添加打印然后 sys.exit()
  • @Yash 但我不想退出。例如,如果用户在 repl 中工作,则应该显示一个简单的错误而不会留下很长的痕迹,之后用户应该能够继续工作(使用异常中的提示)

标签: python exception error-handling


【解决方案1】:

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

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:

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

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2018-08-20
    • 2010-10-18
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多