diff options
author | Fred Drake <fdrake@acm.org> | 2001-09-24 18:44:11 (GMT) |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2001-09-24 18:44:11 (GMT) |
commit | 2d879017b3a259e13b1e1cec5b8bc652432c1849 (patch) | |
tree | c1e8823792decd3b9a238869a1df1091ab3c08d4 /Lib/test/test_profilehooks.py | |
parent | 2205642fe0af9c00bbfa713dae1c8ba4562d2236 (diff) | |
download | cpython-2d879017b3a259e13b1e1cec5b8bc652432c1849.zip cpython-2d879017b3a259e13b1e1cec5b8bc652432c1849.tar.gz cpython-2d879017b3a259e13b1e1cec5b8bc652432c1849.tar.bz2 |
Add more tests showing the relationship between exceptions raised & caught
and the information provided to the profiler. This stuff is a mess!
Diffstat (limited to 'Lib/test/test_profilehooks.py')
-rw-r--r-- | Lib/test/test_profilehooks.py | 73 |
1 files changed, 64 insertions, 9 deletions
diff --git a/Lib/test/test_profilehooks.py b/Lib/test/test_profilehooks.py index 93ad552..c247728 100644 --- a/Lib/test/test_profilehooks.py +++ b/Lib/test/test_profilehooks.py @@ -28,10 +28,10 @@ class HookWatcher: def get_events(self): """Remove calls to add_event().""" - add_event = self.add_event.im_func.func_code - disallowed = (add_event.co_firstlineno, add_event.co_name) + disallowed = [ident(self.add_event.im_func), ident(ident)] + self.frames = None - return [item for item in self.events if item[2] != disallowed] + return [item for item in self.events if item[2] not in disallowed] class ProfileHookTestCase(unittest.TestCase): @@ -52,34 +52,89 @@ class ProfileHookTestCase(unittest.TestCase): def test_exception(self): def f(p): - try: - 1/0 - except: - pass + try: 1/0 + except: pass f_ident = ident(f) self.check_events(f, [(0, 'call', f_ident), (0, 'exception', f_ident), (0, 'return', f_ident), ]) + def test_caught_nested_exception(self): + def f(p): + try: 1/0 + except: pass + def g(p): + f(p) + f_ident = ident(f) + g_ident = ident(g) + self.check_events(g, [(0, 'call', g_ident), + (1, 'call', f_ident), + (1, 'exception', f_ident), + (1, 'return', f_ident), + (0, 'return', g_ident), + ]) + def test_nested_exception(self): def f(p): 1/0 def g(p): + try: f(p) + except: pass + f_ident = ident(f) + g_ident = ident(g) + self.check_events(g, [(0, 'call', g_ident), + (1, 'call', f_ident), + (1, 'exception', f_ident), + # This isn't what I expected: + (0, 'exception', g_ident), + # I expected this again: + # (1, 'exception', f_ident), + (0, 'return', g_ident), + ]) + + def test_exception_in_except_clause(self): + def f(p): + 1/0 + def g(p): try: f(p) except: - pass + try: f(p) + except: pass f_ident = ident(f) g_ident = ident(g) self.check_events(g, [(0, 'call', g_ident), (1, 'call', f_ident), (1, 'exception', f_ident), - # This isn't what I expected: + (0, 'exception', g_ident), + (2, 'call', f_ident), + (2, 'exception', f_ident), (0, 'exception', g_ident), (0, 'return', g_ident), ]) + def test_exception_propogation(self): + def f(p): + 1/0 + def g(p): + try: f(p) + finally: p.add_event("falling through") + def h(p): + try: g(p) + except: pass + f_ident = ident(f) + g_ident = ident(g) + h_ident = ident(h) + self.check_events(h, [(0, 'call', h_ident), + (1, 'call', g_ident), + (2, 'call', f_ident), + (2, 'exception', f_ident), + (1, 'exception', g_ident), + (1, 'falling through', g_ident), + (0, 'exception', h_ident), + (0, 'return', h_ident), + ]) def ident(function): if hasattr(function, "f_code"): |