我想创建一个不打印堆栈跟踪的 Python 异常(对于简单的用户错误)。我在下面创建了一个包装自定义类的函数,但我更愿意将它直接烘焙到自定义异常类中,这可能以某种方式实现吗?
class UserError(Exception):
pass
def throw_user_error(s_msg):
sys.tracebacklimit = 0
raise UserError(s_msg)
sys.tracebacklimit = 1000
答案 0 :(得分:0)
要实现这一点,您应该创建自定义处理程序,而不是异常。这个处理程序甚至已经存在于标准库中: 例如:
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:
如果没有这一行(信不信由你),如果我们进一步传播异常,我们将看到一长串递归调用。