2011-01-29 37 views
10

Trong Python, câu lệnh try hỗ trợ mệnh đề else, nó thực thi nếu mã trong khối try không làm tăng ngoại lệ. Ví dụ:Tại sao mệnh đề khác cần thiết cho câu lệnh try trong python?

try: 
    f = open('foo', 'r') 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 
else: 
    data = f.read() 
    f.close() 

Tại sao mệnh đề khác cần thiết? Chúng tôi không thể viết mã ở trên như sau:

try: 
    f = open('foo', 'r') 
    data = f.read() 
    f.close() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

Sẽ không tiến hành thực hiện data = f.read() nếu mở không có ngoại lệ?

Trả lời

14

Sự khác biệt là điều sẽ xảy ra nếu bạn gặp lỗi trong mã f.read() hoặc f.close(). Trong trường hợp này:

try: 
    f = open('foo', 'r') 
    data = f.read() 
    f.close() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

Một lỗi trong f.read() hoặc f.close() trong trường hợp này sẽ cung cấp cho bạn thông điệp log "Unable to open foo", mà rõ ràng là sai.

Trong trường hợp này, điều này được tránh:

try: 
    f = open('foo', 'r') 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 
else: 
    data = f.read() 
    f.close() 

Và lỗi về đọc hoặc đóng cửa sẽ không gây ra một ghi nhật ký, nhưng lỗi sẽ tăng lên uncatched trong cuộc gọi stack.

+1

Cảm ơn Lennart. Điều đó rất rõ ràng! :). Vì vậy, tại sao chúng ta không thấy mệnh đề khác để thử bằng các ngôn ngữ khác như nói Java? :) – John

+10

@ John: Bởi vì chúng không tốt bằng Python? :-) –

2

Từ sự hiểu biết của tôi, mệnh đề else là để giới hạn phạm vi của khối thử đối với mã mà bạn đang cố quản lý các ngoại lệ. Ngoài ra, các khối try của bạn lớn hơn và bạn có thể bắt các ngoại lệ mà bạn không có ý định bắt.

3

else được sử dụng để mã mà phải thực hiện nếu try khoản không tăng một ngoại lệ.

Sử dụng else tốt hơn mệnh đề bổ sung tryelse tránh vô tình bắt ngoại lệ không được mã được bảo vệ bởi tuyên bố try except.

0

@John:
Tôi nghĩ bằng các ngôn ngữ như Java hoặc các ngôn ngữ khác, bạn có các ngoại lệ khác nhau. Ví dụ một cái gì đó như ngoại lệ FileNotFound (hoặc một cái gì đó như thế này, tôi không chắc chắn về tên).
Bằng cách này, bạn có thể xử lý các ngoại lệ khác nhau và hành động tương ứng. Sau đó, bạn biết tại sao lỗi xảy ra, vì mở hoặc đóng.

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