Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_traceback.py @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 100606ef02cf |
| children |
| rev | line source |
|---|---|
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
1 """Test cases for traceback module""" |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
2 |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
3 from _testcapi import traceback_print, exception_print |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
4 from io import StringIO |
|
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
5 import sys |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
6 import unittest |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
7 import re |
|
64858
0d0f1db63431
rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents:
58456
diff
changeset
|
8 from test.support import run_unittest, Error, captured_output |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
9 from test.support import TESTFN, unlink |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
10 |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
11 import traceback |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
12 |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
13 |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
14 class SyntaxTracebackCases(unittest.TestCase): |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
15 # For now, a very minimal set of tests. I want to be sure that |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
16 # formatting of SyntaxErrors works based on changes for 2.1. |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
17 |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
18 def get_exception_format(self, func, exc): |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
19 try: |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
20 func() |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
21 except exc as value: |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
22 return traceback.format_exception_only(exc, value) |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
23 else: |
|
43014
9834301a2fd3
Raise statement normalization in Lib/test/.
Collin Winter <collinw@gmail.com>
parents:
42537
diff
changeset
|
24 raise ValueError("call did not raise exception") |
|
17341
83ee63bcf036
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
17117
diff
changeset
|
25 |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
26 def syntax_error_with_caret(self): |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
27 compile("def fact(x):\n\treturn x!\n", "?", "exec") |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
28 |
|
54583
3a784b217220
Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents:
52877
diff
changeset
|
29 def syntax_error_with_caret_2(self): |
|
3a784b217220
Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents:
52877
diff
changeset
|
30 compile("1 +\n", "?", "exec") |
|
3a784b217220
Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents:
52877
diff
changeset
|
31 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
35890
diff
changeset
|
32 def syntax_error_bad_indentation(self): |
|
40788
e9a6234b26af
* Remove PRINT_ITEM(_TO), PRINT_NEWLINE(_TO) opcodes.
Georg Brandl <georg@python.org>
parents:
40775
diff
changeset
|
33 compile("def spam():\n print(1)\n print(2)", "?", "exec") |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
35890
diff
changeset
|
34 |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
35 def test_caret(self): |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
36 err = self.get_exception_format(self.syntax_error_with_caret, |
|
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
37 SyntaxError) |
|
42188
81930eaae715
Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents:
41969
diff
changeset
|
38 self.assertEqual(len(err), 4) |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
39 self.assertTrue(err[1].strip() == "return x!") |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
40 self.assertIn("^", err[2]) # third line has caret |
|
42188
81930eaae715
Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents:
41969
diff
changeset
|
41 self.assertEqual(err[1].find("!"), err[2].find("^")) # in the right place |
|
17341
83ee63bcf036
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
17117
diff
changeset
|
42 |
|
54583
3a784b217220
Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents:
52877
diff
changeset
|
43 err = self.get_exception_format(self.syntax_error_with_caret_2, |
|
3a784b217220
Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents:
52877
diff
changeset
|
44 SyntaxError) |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
45 self.assertIn("^", err[2]) # third line has caret |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
46 self.assertTrue(err[2].count('\n') == 1) # and no additional newline |
|
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
47 self.assertTrue(err[1].find("+") == err[2].find("^")) # in the right place |
|
54583
3a784b217220
Merged revisions 73232 via svnmerge from
Georg Brandl <georg@python.org>
parents:
52877
diff
changeset
|
48 |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
49 def test_nocaret(self): |
|
64858
0d0f1db63431
rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents:
58456
diff
changeset
|
50 exc = SyntaxError("error", ("x.py", 23, None, "bad syntax")) |
|
0d0f1db63431
rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents:
58456
diff
changeset
|
51 err = traceback.format_exception_only(SyntaxError, exc) |
|
42188
81930eaae715
Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents:
41969
diff
changeset
|
52 self.assertEqual(len(err), 3) |
|
64858
0d0f1db63431
rewrite nocaret test to not rely on a specific SyntaxError
Benjamin Peterson <benjamin@python.org>
parents:
58456
diff
changeset
|
53 self.assertEqual(err[1].strip(), "bad syntax") |
|
17117
33d8dd02aa99
Test that traceback module works with SyntaxErrors with or without carets.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
54 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
35890
diff
changeset
|
55 def test_bad_indentation(self): |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
35890
diff
changeset
|
56 err = self.get_exception_format(self.syntax_error_bad_indentation, |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
35890
diff
changeset
|
57 IndentationError) |
|
42188
81930eaae715
Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents:
41969
diff
changeset
|
58 self.assertEqual(len(err), 4) |
|
81930eaae715
Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents:
41969
diff
changeset
|
59 self.assertEqual(err[1].strip(), "print(2)") |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
60 self.assertIn("^", err[2]) |
|
42188
81930eaae715
Patch by Christian Heimes to change self.assert_(x == y) into
Guido van Rossum <guido@python.org>
parents:
41969
diff
changeset
|
61 self.assertEqual(err[1].find(")"), err[2].find("^")) |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
35890
diff
changeset
|
62 |
|
38453
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
63 def test_base_exception(self): |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
64 # Test that exceptions derived from BaseException are formatted right |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
65 e = KeyboardInterrupt() |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
66 lst = traceback.format_exception_only(e.__class__, e) |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
67 self.assertEqual(lst, ['KeyboardInterrupt\n']) |
|
29ae5e0fc348
Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
68 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
69 def test_format_exception_only_bad__str__(self): |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
70 class X(Exception): |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
71 def __str__(self): |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
72 1/0 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
73 err = traceback.format_exception_only(X, X()) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
74 self.assertEqual(len(err), 1) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
75 str_value = '<unprintable %s object>' % X.__name__ |
|
44098
0889daf6d0d9
#1535: rename __builtin__ module to builtins.
Georg Brandl <georg@python.org>
parents:
43014
diff
changeset
|
76 if X.__module__ in ('__main__', 'builtins'): |
|
40958
e5e9837da70b
Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents:
40954
diff
changeset
|
77 str_name = X.__name__ |
|
e5e9837da70b
Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents:
40954
diff
changeset
|
78 else: |
|
e5e9837da70b
Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents:
40954
diff
changeset
|
79 str_name = '.'.join([X.__module__, X.__name__]) |
|
e5e9837da70b
Tweak the fix for test_traceback since the fix for it to run on its own broke
Brett Cannon <bcannon@gmail.com>
parents:
40954
diff
changeset
|
80 self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value)) |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
81 |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39690
diff
changeset
|
82 def test_without_exception(self): |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39690
diff
changeset
|
83 err = traceback.format_exception_only(None, None) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39690
diff
changeset
|
84 self.assertEqual(err, ['None\n']) |
|
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39690
diff
changeset
|
85 |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
86 def test_encoded_file(self): |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
87 # Test that tracebacks are correctly printed for encoded source files: |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
88 # - correct line number (Issue2384) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
89 # - respect file encoding (Issue3975) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
90 import tempfile, sys, subprocess, os |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
91 |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
92 # The spawned subprocess has its stdout redirected to a PIPE, and its |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
93 # encoding may be different from the current interpreter, on Windows |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
94 # at least. |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
95 process = subprocess.Popen([sys.executable, "-c", |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
96 "import sys; print(sys.stdout.encoding)"], |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
97 stdout=subprocess.PIPE, |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
98 stderr=subprocess.STDOUT) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
99 stdout, stderr = process.communicate() |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
100 output_encoding = str(stdout, 'ascii').splitlines()[0] |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
101 |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
102 def do_test(firstlines, message, charset, lineno): |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
103 # Raise the message in a subprocess, and catch the output |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
104 try: |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
105 output = open(TESTFN, "w", encoding=charset) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
106 output.write("""{0}if 1: |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
107 import traceback; |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
108 raise RuntimeError('{1}') |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
109 """.format(firstlines, message)) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
110 output.close() |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
111 process = subprocess.Popen([sys.executable, TESTFN], |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
112 stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
113 stdout, stderr = process.communicate() |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
114 stdout = stdout.decode(output_encoding).splitlines() |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
115 finally: |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
116 unlink(TESTFN) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
117 |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
118 # The source lines are encoded with the 'backslashreplace' handler |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
119 encoded_message = message.encode(output_encoding, |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
120 'backslashreplace') |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
121 # and we just decoded them with the output_encoding. |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
122 message_ascii = encoded_message.decode(output_encoding) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
123 |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
124 err_line = "raise RuntimeError('{0}')".format(message_ascii) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
125 err_msg = "RuntimeError: {0}".format(message_ascii) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
126 |
|
58456
f0f221e1a7c0
use assert[Not]In where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents:
58415
diff
changeset
|
127 self.assertIn(("line %s" % lineno), stdout[1], |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
128 "Invalid line number: {0!r} instead of {1}".format( |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
129 stdout[1], lineno)) |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
130 self.assertTrue(stdout[2].endswith(err_line), |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
131 "Invalid traceback line: {0!r} instead of {1!r}".format( |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
132 stdout[2], err_line)) |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
133 self.assertTrue(stdout[3] == err_msg, |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
134 "Invalid error message: {0!r} instead of {1!r}".format( |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
135 stdout[3], err_msg)) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
136 |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
137 do_test("", "foo", "ascii", 3) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
138 for charset in ("ascii", "iso-8859-1", "utf-8", "GBK"): |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
139 if charset == "ascii": |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
140 text = "foo" |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
141 elif charset == "GBK": |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
142 text = "\u4E02\u5100" |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
143 else: |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
144 text = "h\xe9 ho" |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
145 do_test("# coding: {0}\n".format(charset), |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
146 text, charset, 4) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
147 do_test("#!shebang\n# coding: {0}\n".format(charset), |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
148 text, charset, 5) |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48474
diff
changeset
|
149 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
38453
diff
changeset
|
150 |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
151 class TracebackFormatTests(unittest.TestCase): |
|
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
152 |
|
85046
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
153 def some_exception(self): |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
154 raise KeyError('blah') |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
155 |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
156 def check_traceback_format(self, cleanup_func=None): |
|
52877
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
157 try: |
|
85046
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
158 self.some_exception() |
|
52877
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
159 except KeyError: |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
160 type_, value, tb = sys.exc_info() |
|
85046
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
161 if cleanup_func is not None: |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
162 # Clear the inner frames, not this one |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
163 cleanup_func(tb.tb_next) |
|
52877
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
164 traceback_fmt = 'Traceback (most recent call last):\n' + \ |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
165 ''.join(traceback.format_tb(tb)) |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
166 file_ = StringIO() |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
167 traceback_print(tb, file_) |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
168 python_fmt = file_.getvalue() |
|
83553
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
169 # Call all _tb and _exc functions |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
170 with captured_output("stderr") as tbstderr: |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
171 traceback.print_tb(tb) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
172 tbfile = StringIO() |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
173 traceback.print_tb(tb, file=tbfile) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
174 with captured_output("stderr") as excstderr: |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
175 traceback.print_exc() |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
176 excfmt = traceback.format_exc() |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
177 excfile = StringIO() |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
178 traceback.print_exc(file=excfile) |
|
52877
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
179 else: |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
180 raise Error("unable to create test traceback string") |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
181 |
|
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
182 # Make sure that Python and the traceback module format the same thing |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
183 self.assertEqual(traceback_fmt, python_fmt) |
|
83553
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
184 # Now verify the _tb func output |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
185 self.assertEqual(tbstderr.getvalue(), tbfile.getvalue()) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
186 # Now verify the _exc func output |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
187 self.assertEqual(excstderr.getvalue(), excfile.getvalue()) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
188 self.assertEqual(excfmt, excfile.getvalue()) |
|
52877
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
189 |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
190 # Make sure that the traceback is properly indented. |
|
52877
37d6af6f85aa
Merged revisions 71237-71238 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49484
diff
changeset
|
191 tb_lines = python_fmt.splitlines() |
|
85046
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
192 self.assertEqual(len(tb_lines), 5) |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
193 banner = tb_lines[0] |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
194 location, source_line = tb_lines[-2:] |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
195 self.assertTrue(banner.startswith('Traceback')) |
|
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
196 self.assertTrue(location.startswith(' File')) |
|
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
197 self.assertTrue(source_line.startswith(' raise')) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
198 |
|
85046
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
199 def test_traceback_format(self): |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
200 self.check_traceback_format() |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
201 |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
202 def test_traceback_format_with_cleared_frames(self): |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
203 # Check that traceback formatting also works with a clear()ed frame |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
204 def cleanup_tb(tb): |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
205 tb.tb_frame.clear() |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
206 self.check_traceback_format(cleanup_tb) |
|
862ab99ab570
Issue #17934: Add a clear() method to frame objects, to help clean up expensive details (local variables) and break reference cycles.
Antoine Pitrou <solipsis@pitrou.net>
parents:
83553
diff
changeset
|
207 |
|
83553
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
208 def test_stack_format(self): |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
209 # Verify _stack functions. Note we have to use _getframe(1) to |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
210 # compare them without this frame appearing in the output |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
211 with captured_output("stderr") as ststderr: |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
212 traceback.print_stack(sys._getframe(1)) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
213 stfile = StringIO() |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
214 traceback.print_stack(sys._getframe(1), file=stfile) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
215 self.assertEqual(ststderr.getvalue(), stfile.getvalue()) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
216 |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
217 stfmt = traceback.format_stack(sys._getframe(1)) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
218 |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
219 self.assertEqual(ststderr.getvalue(), "".join(stfmt)) |
|
84cef4f1999a
refactor traceback.py to reduce code duplication (closes #17646)
Benjamin Peterson <benjamin@python.org>
parents:
75292
diff
changeset
|
220 |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
221 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
222 cause_message = ( |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
223 "\nThe above exception was the direct cause " |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
224 "of the following exception:\n\n") |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
225 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
226 context_message = ( |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
227 "\nDuring handling of the above exception, " |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
228 "another exception occurred:\n\n") |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
229 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
230 boundaries = re.compile( |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
231 '(%s|%s)' % (re.escape(cause_message), re.escape(context_message))) |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
232 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
233 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
234 class BaseExceptionReportingTests: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
235 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
236 def get_exception(self, exception_or_callable): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
237 if isinstance(exception_or_callable, Exception): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
238 return exception_or_callable |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
239 try: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
240 exception_or_callable() |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
241 except Exception as e: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
242 return e |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
243 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
244 def zero_div(self): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
245 1/0 # In zero_div |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
246 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
247 def check_zero_div(self, msg): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
248 lines = msg.splitlines() |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
249 self.assertTrue(lines[-3].startswith(' File')) |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
250 self.assertIn('1/0 # In zero_div', lines[-2]) |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
251 self.assertTrue(lines[-1].startswith('ZeroDivisionError'), lines[-1]) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
252 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
253 def test_simple(self): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
254 try: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
255 1/0 # Marker |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
256 except ZeroDivisionError as _: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
257 e = _ |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
258 lines = self.get_report(e).splitlines() |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
259 self.assertEqual(len(lines), 4) |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
260 self.assertTrue(lines[0].startswith('Traceback')) |
|
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
261 self.assertTrue(lines[1].startswith(' File')) |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
262 self.assertIn('1/0 # Marker', lines[2]) |
|
55593
0bb232078b8c
Merged revisions 73715 via svnmerge from
Georg Brandl <georg@python.org>
parents:
54583
diff
changeset
|
263 self.assertTrue(lines[3].startswith('ZeroDivisionError')) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
264 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
265 def test_cause(self): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
266 def inner_raise(): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
267 try: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
268 self.zero_div() |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
269 except ZeroDivisionError as e: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
270 raise KeyError from e |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
271 def outer_raise(): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
272 inner_raise() # Marker |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
273 blocks = boundaries.split(self.get_report(outer_raise)) |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
274 self.assertEqual(len(blocks), 3) |
|
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
275 self.assertEqual(blocks[1], cause_message) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
276 self.check_zero_div(blocks[0]) |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
277 self.assertIn('inner_raise() # Marker', blocks[2]) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
278 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
279 def test_context(self): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
280 def inner_raise(): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
281 try: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
282 self.zero_div() |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
283 except ZeroDivisionError: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
284 raise KeyError |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
285 def outer_raise(): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
286 inner_raise() # Marker |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
287 blocks = boundaries.split(self.get_report(outer_raise)) |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
288 self.assertEqual(len(blocks), 3) |
|
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
289 self.assertEqual(blocks[1], context_message) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
290 self.check_zero_div(blocks[0]) |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
291 self.assertIn('inner_raise() # Marker', blocks[2]) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
292 |
|
75292
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
293 def test_context_suppression(self): |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
294 try: |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
295 try: |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
296 raise Exception |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
297 except: |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
298 raise ZeroDivisionError from None |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
299 except ZeroDivisionError as _: |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
300 e = _ |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
301 lines = self.get_report(e).splitlines() |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
302 self.assertEqual(len(lines), 4) |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
303 self.assertTrue(lines[0].startswith('Traceback')) |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
304 self.assertTrue(lines[1].startswith(' File')) |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
305 self.assertIn('ZeroDivisionError from None', lines[2]) |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
306 self.assertTrue(lines[3].startswith('ZeroDivisionError')) |
|
b299c4f31ff2
Close issue #6210: Implement PEP 409
Nick Coghlan <ncoghlan@gmail.com>
parents:
68257
diff
changeset
|
307 |
|
57498
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
308 def test_cause_and_context(self): |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
309 # When both a cause and a context are set, only the cause should be |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
310 # displayed and the context should be muted. |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
311 def inner_raise(): |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
312 try: |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
313 self.zero_div() |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
314 except ZeroDivisionError as _e: |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
315 e = _e |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
316 try: |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
317 xyzzy |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
318 except NameError: |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
319 raise KeyError from e |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
320 def outer_raise(): |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
321 inner_raise() # Marker |
|
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
322 blocks = boundaries.split(self.get_report(outer_raise)) |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
323 self.assertEqual(len(blocks), 3) |
|
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
324 self.assertEqual(blocks[1], cause_message) |
|
57498
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
325 self.check_zero_div(blocks[0]) |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
326 self.assertIn('inner_raise() # Marker', blocks[2]) |
|
57498
4bed796ee0d7
Merged revisions 76573 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55593
diff
changeset
|
327 |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
328 def test_cause_recursive(self): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
329 def inner_raise(): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
330 try: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
331 try: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
332 self.zero_div() |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
333 except ZeroDivisionError as e: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
334 z = e |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
335 raise KeyError from e |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
336 except KeyError as e: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
337 raise z from e |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
338 def outer_raise(): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
339 inner_raise() # Marker |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
340 blocks = boundaries.split(self.get_report(outer_raise)) |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
341 self.assertEqual(len(blocks), 3) |
|
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
342 self.assertEqual(blocks[1], cause_message) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
343 # The first block is the KeyError raised from the ZeroDivisionError |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
344 self.assertIn('raise KeyError from e', blocks[0]) |
|
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
345 self.assertNotIn('1/0', blocks[0]) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
346 # The second block (apart from the boundary) is the ZeroDivisionError |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
347 # re-raised from the KeyError |
|
58415
f6a626f34840
use assert[Not]In where appropriate
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
348 self.assertIn('inner_raise() # Marker', blocks[2]) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
349 self.check_zero_div(blocks[2]) |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
350 |
|
65615
53639e57ba40
Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
351 def test_syntax_error_offset_at_eol(self): |
|
53639e57ba40
Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
352 # See #10186. |
|
53639e57ba40
Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
353 def e(): |
|
53639e57ba40
Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
354 raise SyntaxError('', ('', 0, 5, 'hello')) |
|
53639e57ba40
Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
355 msg = self.get_report(e).splitlines() |
|
53639e57ba40
Merged revisions 85814 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
57498
diff
changeset
|
356 self.assertEqual(msg[-2], " ^") |
|
65696
e8c8400caa99
Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
65615
diff
changeset
|
357 def e(): |
|
e8c8400caa99
Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
65615
diff
changeset
|
358 exec("x = 5 | 4 |") |
|
e8c8400caa99
Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
65615
diff
changeset
|
359 msg = self.get_report(e).splitlines() |
|
e8c8400caa99
Merged revisions 85817,85904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
65615
diff
changeset
|
360 self.assertEqual(msg[-2], ' ^') |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
361 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
362 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
363 class PyExcReportingTests(BaseExceptionReportingTests, unittest.TestCase): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
364 # |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
365 # This checks reporting through the 'traceback' module, with both |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
366 # format_exception() and print_exception(). |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
367 # |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
368 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
369 def get_report(self, e): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
370 e = self.get_exception(e) |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
371 s = ''.join( |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
372 traceback.format_exception(type(e), e, e.__traceback__)) |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
373 with captured_output("stderr") as sio: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
374 traceback.print_exception(type(e), e, e.__traceback__) |
|
66340
2beb25369289
Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
65696
diff
changeset
|
375 self.assertEqual(sio.getvalue(), s) |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
376 return s |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
377 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
378 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
379 class CExcReportingTests(BaseExceptionReportingTests, unittest.TestCase): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
380 # |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
381 # This checks built-in reporting by the interpreter. |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
382 # |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
383 |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
384 def get_report(self, e): |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
385 e = self.get_exception(e) |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
386 with captured_output("stderr") as s: |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
387 exception_print(e) |
|
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
388 return s.getvalue() |
|
46664
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
389 |
|
031dfe455585
Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44098
diff
changeset
|
390 |
|
85723
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
391 class MiscTracebackCases(unittest.TestCase): |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
392 # |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
393 # Check non-printing functions in traceback module |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
394 # |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
395 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
396 def test_clear(self): |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
397 def outer(): |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
398 middle() |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
399 def middle(): |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
400 inner() |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
401 def inner(): |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
402 i = 1 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
403 1/0 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
404 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
405 try: |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
406 outer() |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
407 except: |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
408 type_, value, tb = sys.exc_info() |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
409 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
410 # Initial assertion: there's one local in the inner frame. |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
411 inner_frame = tb.tb_next.tb_next.tb_next.tb_frame |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
412 self.assertEqual(len(inner_frame.f_locals), 1) |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
413 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
414 # Clear traceback frames |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
415 traceback.clear_frames(tb) |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
416 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
417 # Local variable dict should now be empty. |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
418 self.assertEqual(len(inner_frame.f_locals), 0) |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
419 |
|
100606ef02cf
#1565525: Add traceback.clear_frames() helper function to clear locals ref'd by a traceback
Andrew Kuchling <amk@amk.ca>
parents:
85046
diff
changeset
|
420 |
|
20013
e3184e46303b
Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents:
17558
diff
changeset
|
421 def test_main(): |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47201
diff
changeset
|
422 run_unittest(__name__) |
|
20013
e3184e46303b
Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents:
17558
diff
changeset
|
423 |
|
e3184e46303b
Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents:
17558
diff
changeset
|
424 if __name__ == "__main__": |
|
e3184e46303b
Change the PyUnit-based tests to use the test_main() approach. This
Fred Drake <fdrake@acm.org>
parents:
17558
diff
changeset
|
425 test_main() |
