【问题标题】:Custom exception python + Sentry stacktrace自定义异常 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

并且仍然保留堆栈跟踪,但最终没有堆栈跟踪可用。 我做错了什么?

【问题讨论】:

    标签: python sentry


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2020-04-08
      • 2011-01-16
      相关资源
      最近更新 更多