2017-12-12 110 views
5

Tôi muốn theo dõi các ngoại lệ bên trong từ điển và trả lại như cũ. Tuy nhiên khi tôi làm như vậy, cuối cùng khối cho tôi một từ điển trống. Logic khá nhiều công trình cho vô hướng. Ai đó có thể giải thích hành vi được không.Tại sao trở lại bên trong cuối cùng cho từ điển trống?

Trong bối cảnh vô hướng:

def test(): 
    temp = 1 
    try: 
     raise ValueError("sdfs") 
    except: 
     temp = 2 
    finally: 
     temp = temp + 3 
     return temp 
test() 
5 

Với từ điển:

def test(): 
    temp = dict() 
    try: 
     raise ValueError("something") 
    except Exception as error: 
     print("error is :{}".format(error)) 
     temp['except'] = "something" + error 
    finally: 
     return temp 

test() 
error is : something 
{} 
+0

đâu là mã mà in ra kết quả cuối cùng –

+0

Lưu ý rằng? Python không có khái niệm 'ngữ cảnh vô hướng'. Bạn đang nghĩ đến Perl ở đó, có lẽ là –

+0

vâng ... bạn có bối cảnh mặc dù :) – saz01

Trả lời

6

Bạn gây ra một ngoại lệ được nâng lên trong xử lý ngoại lệ, được nuốt vì có một handler finally rằng lợi nhuận từ chức năng.

Bạn không thể chỉ ghép một đối tượng ngoại lệ và một chuỗi, do đó, thêm TypeError được nâng lên và việc gán cho từ điển không bao giờ được tiếp cận.

Chuyển đổi các ngoại lệ đối với một chuỗi tác phẩm đầu tiên:

>>> def test(): 
...  temp = dict() 
...  try: 
...   raise ValueError("something") 
...  except Exception as error: 
...   print("error is :{}".format(error)) 
...   temp['except'] = "something" + str(error) 
...  finally: 
...   return temp 
... 
>>> test() 
error is :something 
{'except': 'somethingsomething'} 

Từ try statement documentation:

Nếu finally hiện diện, nó xác định một handler ‘dọn dẹp’. Mệnh đề try được thực thi, bao gồm bất kỳ mệnh đề exceptelse nào. Nếu một ngoại lệ xảy ra trong bất kỳ mệnh đề nào và không được xử lý, ngoại lệ tạm thời được lưu. Mệnh đề finally được thực hiện. Nếu có ngoại lệ đã lưu, nó sẽ được nâng lên vào cuối điều khoản finally. Nếu mệnh đề finally tăng ngoại lệ khác, ngoại lệ đã lưu được đặt làm ngữ cảnh của ngoại lệ mới. Nếu mệnh đề finally thực hiện một tuyên bố return hoặc break, ngoại trừ lưu bị loại bỏ [.]

(tôi nhấn mạnh Bold).

+0

Phát hiện ... cảm ơn bạn rất nhiều !! – saz01

4

Dòng "something" + error tăng lỗi bị hủy vì bạn đã trả lại từ finally. Do lỗi, việc gán cho từ điển temp không bao giờ được thực hiện tạo ấn tượng rằng không có gì xảy ra.

Điều này được nêu trong the documentation cho try-except:

Nếu cuối cùng có mặt, nó xác định một handler ‘dọn dẹp’. Điều khoản try được thực hiện, bao gồm bất kỳ điều khoản ngoại trừ và các điều khoản khác. Nếu một ngoại lệ xảy ra trong bất kỳ điều khoản nào và không được xử lý, ngoại lệ tạm thời được lưu. Điều khoản cuối cùng được thực hiện. Nếu có một ngoại lệ đã lưu, nó sẽ được nâng lên vào cuối mệnh đề cuối cùng là . Nếu mệnh đề cuối cùng đưa ra một ngoại lệ khác, ngoại lệ được lưu được đặt làm ngữ cảnh của ngoại lệ mới. Nếu mệnh đề cuối cùng là thực thi câu lệnh trả lại hoặc ngắt, ngoại lệ đã lưu là bị hủy.

(tôi nhấn mạnh)

Nếu không có một lỗi (tức là temp['except'] = error bạn có được những hành vi mong đợi:

>>> test() 
error is :something 
{'except': ValueError('something')} 
Các vấn đề liên quan