python - 如何在没有堆栈跟踪的情况下创建 Python 异常?
问题描述
我想创建一个不打印堆栈跟踪的 Python 异常(对于简单的用户错误)。我在下面创建了一个包装自定义类的函数,但我更愿意将它直接烘焙到自定义异常类中,这可能吗?
class UserError(Exception):
pass
def throw_user_error(s_msg):
sys.tracebacklimit = 0
raise UserError(s_msg)
sys.tracebacklimit = 1000
解决方案
为此,您应该创建自定义处理程序,而不是异常。这个处理程序甚至已经存在于标准库中:例如:
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:
如果没有这条线(信不信由你),如果我们进一步传播异常,我们将看到长长的递归调用堆栈。
推荐阅读
- javascript - 一个 Next.js 路由中的两个不同子域
- c# - 如何定义一个接口方法,其不同的实现可以返回
, 列表 , 列表 - > 其中 T 是自定义类
- windows - 仅使用 Firesharp for Windows 桌面推送通知
- mongodb - MongoDB 4.2 中没有主节点
- javascript - 如何使用javascript在数组对象变量中使用foreach循环
- java - Rest 服务的响应正文为空
- python - RuntimeError: Not connected to CAN bus 这个怎么解决
- google-apps-script - PropertiesService - 范围问题。如何在组织之间分离属性
- oracle - 保存搜索公式时的 Netsuite 案例,包括除法
- asp.net - 如何从转发器的第一行获取数据属性值列表?