Skip to content

user_exception

AddFrame dataclass

Add a dummy frame with a filename and line number.

Source code in lineapy/exceptions/user_exception.py
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@dataclass
class AddFrame:
    """
    Add a dummy frame with a filename and line number.
    """

    filename: str
    lineno: int

    def execute(self, traceback: Optional[TracebackType]) -> TracebackType:
        code = compile("", self.filename, "exec")

        return TracebackType(
            traceback,
            create_frame(code),
            0,
            self.lineno,
        )

RemoveFrames dataclass

Remove n frames from the top

Source code in lineapy/exceptions/user_exception.py
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@dataclass
class RemoveFrames:
    """
    Remove n frames from the top
    """

    n: int

    def execute(
        self, traceback: Optional[TracebackType]
    ) -> Optional[TracebackType]:
        for _ in range(self.n):
            assert traceback
            traceback = traceback.tb_next
        return traceback

RemoveFramesWhile dataclass

Remove frames while the predicate is true

Source code in lineapy/exceptions/user_exception.py
73
74
75
76
77
78
79
80
81
82
83
84
85
86
@dataclass
class RemoveFramesWhile:
    """
    Remove frames while the predicate is true
    """

    predicate: Callable[[FrameType], bool]

    def execute(
        self, traceback: Optional[TracebackType]
    ) -> Optional[TracebackType]:
        while traceback and self.predicate(traceback.tb_frame):
            traceback = traceback.tb_next
        return traceback

UserException

Bases: Exception

Create a traceback based on an original traceback with a number of changes applied to it.

Source code in lineapy/exceptions/user_exception.py
11
12
13
14
15
16
17
18
19
20
21
22
23
class UserException(Exception):
    """
    Create a traceback based on an original traceback with a number of changes
    applied to it.
    """

    __cause__: Exception

    def __init__(self, cause: Exception, *changes: TracebackChange):
        if REWRITE_EXCEPTIONS:
            apply_changes(cause, changes)

        self.__cause__ = cause

apply_changes(exc, changes)

Update an exception's traceback with the changes provided.

Source code in lineapy/exceptions/user_exception.py
26
27
28
29
30
31
32
33
def apply_changes(exc: Exception, changes: Iterable[TracebackChange]) -> None:
    """
    Update an exception's traceback with the changes provided.
    """
    tb = exc.__traceback__
    for change in changes:
        tb = change.execute(tb)
    exc.__traceback__ = tb

Was this helpful?

Help us improve docs with your feedback!