2016-07-30 15 views
6

Đôi khi, tôi không thể xác định khi nào hoặc những gì gây ra nó, pdb sẽ không giúp bạn với các mã như:Tại sao pdb không thể truy cập một biến chứa một ngoại lệ?

try: 
    foo() 
except Exception as e: 
    import pdb; pdb.set_trace() 

Bạn kết thúc với dấu nhắc bình thường, nhưng cố gắng truy cập e sẽ dẫn đến:

(pdb) e 
*** NameError: name 'e' is not defined. 

đó là không phải tất cả các thời gian tất nhiên, và nó xảy ra trên linux, windows, máy tính của tôi, máy đồng nghiệp của tôi ...

+1

Xác nhận là Python 3 chỉ; nó hoạt động (như mong đợi) trong Python 2. –

Trả lời

7

trong Python 3, mục tiêu của một câu lệnh except .. as target sẽ bị xóa khi bộ thoát. Từ số try statement documentation:

Khi ngoại lệ được chỉ định sử dụng làm target, nó sẽ bị xóa ở cuối điều khoản ngoại trừ. Đây là như thể

except E as N: 
    foo 

được dịch sang

except E as N: 
    try: 
     foo 
    finally: 
     del N 

này có nghĩa là ngoại lệ phải được gán cho một tên khác nhau để có thể tham khảo nó sau khi trừ khoản. Các ngoại lệ được xóa bởi vì với traceback gắn liền với chúng, chúng tạo thành một chu trình tham chiếu với khung ngăn xếp, giữ cho tất cả người dân trong khung đó còn sống cho đến khi việc thu gom rác tiếp theo xảy ra.

Gọi số pdb.set_trace() thực hiện thoát khỏi khối, do đó, đoạn mã ngụ ý finally ở trên được thực thi.

Bind các ngoại lệ đối với một cái tên khác:

try: 
    foo() 
except Exception as e: 
    exception = e 
    import pdb; pdb.set_trace() 

Demo:

>>> try: 
...  foo() 
... except Exception as e: 
... exception = e 
... import pdb; pdb.set_trace() 
... 
--Return-- 
> <stdin>(5)<module>()->None 
(Pdb) e 
*** NameError: name 'e' is not defined 
(Pdb) exception 
NameError("name 'foo' is not defined",) 
Các vấn đề liên quan