Message339566
@Saim wrote
> https://docs.python.org/3/reference/compound_stmts.html#the-try-statement says
This is correct, the disassembly of foo.py below demonstrates that point: BEGIN_FINALLY at bytecode index 36 starts the implementation of the 'finally' clause that deletes 'err'. But pdb is a line debugger, not a debugger at the bytecode level, so when 'foo = 1' is replaced by 'import pdb; pdb.set_trace()', the first line where pdb may stop is at line 6 and since foo() last line is line 5, pdb stops at the 'return' event for this function.
======= foo.py ========
def foo():
try:
1/0
except Exception as err:
foo = 1
import dis
dis.dis(foo)
===========================
2 0 SETUP_FINALLY 12 (to 14)
3 2 LOAD_CONST 1 (1)
4 LOAD_CONST 2 (0)
6 BINARY_TRUE_DIVIDE
8 POP_TOP
10 POP_BLOCK
12 JUMP_FORWARD 38 (to 52)
4 >> 14 DUP_TOP
16 LOAD_GLOBAL 0 (Exception)
18 COMPARE_OP 10 (exception match)
20 POP_JUMP_IF_FALSE 50
22 POP_TOP
24 STORE_FAST 0 (err)
26 POP_TOP
28 SETUP_FINALLY 8 (to 38)
5 30 LOAD_CONST 1 (1)
32 STORE_FAST 1 (foo)
34 POP_BLOCK
36 BEGIN_FINALLY
>> 38 LOAD_CONST 0 (None)
40 STORE_FAST 0 (err)
42 DELETE_FAST 0 (err)
44 END_FINALLY
46 POP_EXCEPT
48 JUMP_FORWARD 2 (to 52)
>> 50 END_FINALLY
>> 52 LOAD_CONST 0 (None)
54 RETURN_VALUE
=========================== |
|
Date |
User |
Action |
Args |
2019-04-07 09:29:42 | xdegaye | set | recipients:
+ xdegaye, barry, SilentGhost, Saim Raza |
2019-04-07 09:29:42 | xdegaye | set | messageid: <1554629382.25.0.314812126828.issue36537@roundup.psfhosted.org> |
2019-04-07 09:29:42 | xdegaye | link | issue36537 messages |
2019-04-07 09:29:41 | xdegaye | create | |
|