File: missing_attributes_traceback_objects.py

package info (click to toggle)
loguru 0.7.3-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,568 kB
  • sloc: python: 13,164; javascript: 49; makefile: 14
file content (42 lines) | stat: -rw-r--r-- 1,136 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import sys
from collections import namedtuple

from loguru import logger

logger.remove()
logger.add(sys.stderr, format="", colorize=False, backtrace=True, diagnose=False)


a, b = 1, 0


def div(x, y):
    x / y


def foo():
    div(a, b)


# See Twisted: https://github.com/twisted/twisted/blob/29cbe/src/twisted/python/failure.py#L175-L181
# See Billiard: https://github.com/celery/billiard/blob/529a3/billiard/einfo.py#L11-L26
fake_code = namedtuple("fake_code", ("co_filename", "co_name"))
fake_frame = namedtuple("fake_frame", ("f_back", "f_code", "f_globals", "f_lineno", "f_locals"))
fake_traceback = namedtuple("fake_traceback", ("tb_frame", "tb_lasti", "tb_lineno", "tb_next"))


def make_fake(tb):
    if not tb:
        return None
    code = fake_code(tb.tb_frame.f_code.co_filename, tb.tb_frame.f_code.co_name)
    frame = fake_frame(None, code, {}, tb.tb_lineno, {})
    tb = fake_traceback(frame, tb.tb_lasti, tb.tb_lineno, make_fake(tb.tb_next))
    return tb


try:
    foo()
except ZeroDivisionError:
    type_, value, tb = sys.exc_info()
    tb = make_fake(tb)
    logger.opt(exception=(type_, value, tb)).error("")