自定义异常 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的异常数据上报机制

有没有办法从 Sentry 捕获日志并将它们发布到我的自定义后端?

Electron常见问题 63 - sentry上传自定义pdb符号表

Electron常见问题 63 - sentry上传自定义pdb符号表

Electron常见问题 63 - sentry上传自定义pdb符号表

如何在 Python 中向 Sentry 发送日志记录附件?