mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
bpo-31299: make it possible to filter out frames from tracebacks (GH-28067)
This commit is contained in:
parent
22fe0eb13c
commit
863154c929
4 changed files with 34 additions and 1 deletions
|
|
@ -357,7 +357,8 @@ capture data for later printing in a lightweight fashion.
|
|||
|
||||
Returns a string for printing one of the frames involved in the stack.
|
||||
This method gets called for each frame object to be printed in the
|
||||
:class:`StackSummary`.
|
||||
:class:`StackSummary`. If it returns ``None``, the frame is omitted
|
||||
from the output.
|
||||
|
||||
.. versionadded:: 3.11
|
||||
|
||||
|
|
|
|||
|
|
@ -1514,6 +1514,34 @@ def some_inner():
|
|||
s.format(),
|
||||
[f'{__file__}:{some_inner.__code__.co_firstlineno + 1}'])
|
||||
|
||||
def test_dropping_frames(self):
|
||||
def f():
|
||||
1/0
|
||||
|
||||
def g():
|
||||
try:
|
||||
f()
|
||||
except:
|
||||
return sys.exc_info()
|
||||
|
||||
exc_info = g()
|
||||
|
||||
class Skip_G(traceback.StackSummary):
|
||||
def format_frame(self, frame):
|
||||
if frame.name == 'g':
|
||||
return None
|
||||
return super().format_frame(frame)
|
||||
|
||||
stack = Skip_G.extract(
|
||||
traceback.walk_tb(exc_info[2])).format()
|
||||
|
||||
self.assertEqual(len(stack), 1)
|
||||
lno = f.__code__.co_firstlineno + 1
|
||||
self.assertEqual(
|
||||
stack[0],
|
||||
f' File "{__file__}", line {lno}, in f\n 1/0\n'
|
||||
)
|
||||
|
||||
|
||||
class TestTracebackException(unittest.TestCase):
|
||||
|
||||
|
|
|
|||
|
|
@ -515,6 +515,9 @@ def format(self):
|
|||
last_name = None
|
||||
count = 0
|
||||
for frame in self:
|
||||
formatted_frame = self.format_frame(frame)
|
||||
if formatted_frame is None:
|
||||
continue
|
||||
if (last_file is None or last_file != frame.filename or
|
||||
last_line is None or last_line != frame.lineno or
|
||||
last_name is None or last_name != frame.name):
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
Add option to completely drop frames from a traceback by returning ``None`` from a :meth:`~traceback.StackSummary.format_frame` override.
|
||||
Loading…
Add table
Add a link
Reference in a new issue