自定义异常 python + Sentry stacktrace
Posted
技术标签:
【中文标题】自定义异常 python + Sentry stacktrace【英文标题】:Custom exception python + Sentry stacktrace 【发布时间】:2021-12-13 14:12:44 【问题描述】:我有一个烧瓶应用程序,我在其中创建了一些自定义异常,我想最终基于这些异常创建警报。 现在,捕获异常有效,但堆栈跟踪没有跟随。
class SentryMailError(Exception):
"""Errors related to sending emails"""
def __init__(self, err):
super().__init__(err)
在X函数中,我希望能够运行:
from sentry_sdk import capture_exception
def randomfunc():
try:
division_by_zero = 1 / 0
except as err:
capture_exception(SentryMaiLError(err)) # no stack trace
capture_exception(err) # stack trace, but not able to use my custom error
并且仍然保留堆栈跟踪,但最终没有堆栈跟踪可用。 我做错了什么?
【问题讨论】:
【参考方案1】:我不太确定堆栈跟踪丢失的原因是什么,但我猜这与您为未通过 *arg, **kwarg
的自定义异常重新实现 __init__
有关。
一个更简单的pythonic代码可能是
class SentryMailError(Exception):
...
from sentry_sdk import handle_my_exception, handle_all_exceptions
def random_func():
try:
division_by_zero = 1 / 0
except SentryMaiLError as e:
handle_my_exception(e)
except Exception as e:
handle_all_exceptions(e)
except Exception as e:
是一种糟糕的形式,因为它捕获的异常过于笼统,但它在高级处理程序中可能是可以接受的,例如会生成 http 500 响应的请求。
【讨论】:
这不是试图捕获 SentryMailError 而不是抛出的实际错误(除以零)吗?还是哨兵的 handle_my_exception 正在做一些魔术?你能解释一下这是做什么的吗?【参考方案2】:这为我解决了问题:
class SentryMailError(Exception):
"""Custom Exception for sentry"""
def __init__(self, err):
self.__traceback__ = err.__traceback__
并捕获:
except Exception as err:
capture_exception(SentryMailError(err))
不确定这是否理想。我只是将异常的回溯设置到我的自定义异常上,stracktrace 将跟随 Sentry。
【讨论】:
以上是关于自定义异常 python + Sentry stacktrace的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法从 Sentry 捕获日志并将它们发布到我的自定义后端?
Electron常见问题 63 - sentry上传自定义pdb符号表
Electron常见问题 63 - sentry上传自定义pdb符号表