最近有个任务把线上的异常用sentry收集,搭建和上报还是比较顺利。官网文档详细。点个赞。部署上线后,我对它是怎么捕捉异常的产生疑问,下载了源码(https://github.com/getsentry/sentry-python),分析了一下。

 

首先,查看sentry_sdk中api.py文件,这里的一个capture_exception方法引起了我的注意,应该能顺着它知道捕捉异常的地方;

跳转进入hub.capture_execption:

貌似并没有什么特殊。再看看event_from_exception

也没有看出它在哪里捕捉了原来的异常。

再看看integrations(集成)目录,像是适配不同的服务的日志收集,应该是我们要找的东西,要找到异常,那应该是跟except有关,打开可疑的excepthook目录瞧一瞧。

果然就是它了。

它通过python的excepthook实现捕捉异常,上报。

写一个简单例子,让python触发异常的时候,先调用一些我们定义的东西:

>>> import sys
>>> def myExcepthook(ttype, tvalue, ttraceback):
...     print("进入我定义的异常")
...     print("例外类型:{}".format(ttype))
...     print("例外对象:{}".format(tvalue))
...     print("结束我定义的异常")
...
>>> sys.excepthook = myExcepthook
>>> 1/0
进入我定义的异常
例外类型:<type 'exceptions.ZeroDivisionError'>
例外对象:integer division or modulo by zero
结束我定义的异常

在把excepthook设置回None.

>>> sys.excepthook = None
>>> 1/0
sys.excepthook is missing
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

又恢复了。

更多excepthook使用例子:https://www.programcreek.com/python/example/1013/sys.excepthook

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐