2010-10-14 75 views
29

Xét đoạn mã sau:Nâng cao trong Python là gì?

try: 
    raise Exception("a") 
except: 
    try: 
     raise Exception("b") 
    finally: 
     raise 

này sẽ nâng cao Exception: a. Tôi hy vọng nó sẽ nâng cao Exception: b (tôi cần giải thích tại sao?). Tại sao raise cuối cùng tăng ngoại lệ ban đầu thay vì (những gì tôi nghĩ) là ngoại lệ cuối cùng được nêu ra?

+7

Python 3.1 tăng cả hai. – kennytm

+1

Ah. Tôi cần phải đề cập đến tôi trên Python 2.6. – wilhelmtell

+1

Chỉ cần tò mò: Trình biên dịch C# trên cùng một kết hợp cho biết: "Lỗi: Lệnh ném không có đối số không được cho phép trong mệnh đề cuối cùng được lồng trong mệnh đề khai thác gần nhất" (throw == raise, catch == except). Không mơ hồ! – Andrey

Trả lời

15

On python2.6

tôi đoán, bạn đang mong đợi các khối finally để được gắn với khối "thử", nơi bạn nâng cao ngoại lệ "B". Khối cuối cùng được gắn vào khối "thử" đầu tiên.

Nếu bạn thêm một ngoại trừ khối trong khối try bên trong, sau đó các khối finally sẽ nâng cao ngoại lệ B.

try: 
    raise Exception("a") 
except: 
    try: 
    raise Exception("b") 
    except: 
    pass 
    finally: 
    raise 

Output:

Traceback (most recent call last): 
    File "test.py", line 5, in <module> 
    raise Exception("b") 
Exception: b 

Một biến thể giải thích whats xảy ra ở đây

try: 
    raise Exception("a") 
except: 
    try: 
    raise Exception("b") 
    except: 
    raise 

Đầu ra:

Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    raise Exception("b") 
Exception: b 

Nếu bạn thấy ở đây, thay thế cho khối finally với ngoại trừ không nâng cao ngoại lệ B.

+0

Tôi đã đi đến cùng một kết luận. –

+0

Thật vậy, tính năng này hoạt động! Tôi chưa bao giờ đoán được. Đây có phải là tài liệu ở đâu đó không? Đây có phải là một tính năng hay nó là một điều cần thiết đến từ các vấn đề trong ngữ pháp? – wilhelmtell

+0

Tại sao ngoại lệ thứ hai chỉ đơn thuần là bóng đầu tiên? Tôi muốn Python sẽ sai cú pháp, hoặc ít nhất là cảnh báo tôi về điều này. – wilhelmtell

26

Raise is re-raising the last exception you caught, not the last exception you raised

(đăng lại từ bình luận cho rõ ràng)

Các vấn đề liên quan