2010-03-29 8 views
202

sự khác biệt giữa là gì '' và 'như' ở ngoại trừ báo cáo, ví dụ:Python try ... except dấu phẩy vs 'như' ở ngoại trừ

try: 
    pass 
except Exception, exception: 
    pass 

và:

try: 
    pass 
except Exception as exception: 
    pass 

Cú pháp thứ hai có hợp pháp trong 2.6 không? Nó hoạt động trong CPython 2.6 trên Windows nhưng trình thông dịch 2.5 trong cygwin phàn nàn rằng nó không hợp lệ.

Nếu cả hai đều hợp lệ trong 2.6 nên tôi sử dụng?

Trả lời

229

Văn bản dứt khoát là PEP-3110: Catching Exceptions

Tóm tắt:

  • Trong Python 3.x, sử dụng ascần gán một ngoại lệ cho một biến.
  • Trong Python 2.6+, sử dụng cú pháp as vì nó ít mơ hồ và tương thích về phía trước với Python 3.x.
  • Trong Python 2.5 trở về trước, hãy sử dụng phiên bản dấu phẩy vì as không được hỗ trợ.
+12

Sử dụng 'as' là cách duy nhất để gán ngoại lệ cho một địa phương trong Python 3.x. Nhưng 'as' không phải là _required_, vì bạn không phải chỉ định nó nếu bạn không cần nó. – mercator

17

Cú pháp "as" là ưa thích trong tương lai, tuy nhiên nếu mã của bạn cần làm việc với các phiên bản Python cũ hơn (2.6 là phiên bản đầu tiên hỗ trợ phiên bản mới) thì bạn cần sử dụng cú pháp dấu phẩy.

33

Có hợp pháp. Tôi đang chạy Python 2,6

try: 
    [] + 3 
except Exception as x: 
    print "woo hoo" 

>>> 
woo hoo 

Cập nhật: Còn có một lý do để sử dụng cú pháp as. Sử dụng , làm cho mọi thứ trở nên mơ hồ hơn nhiều, như những người khác đã chỉ ra; và đây là những gì tạo nên sự khác biệt. Theo Python 2.6, có multicatch cho phép bạn catch multiple exceptions in one except block. Trong một tình huống như vậy, đó là biểu cảm hơn và pythonic nói

except (exception1, exception2) as e 

chứ không phải là để nói

except (exception1, exception2), e 

mà vẫn có thể làm việc

+13

Phiên bản Python * trước * 2.6 cho phép bạn sử dụng một bộ tuple để bắt nhiều loại ngoại lệ. Nhưng cú pháp thì khó hiểu; bạn sẽ sử dụng 'ngoại trừ NameError, ValueError:' sau đó tự hỏi tại sao ngoại lệ 'ValueError' không bao giờ bị bắt. Hoặc sử dụng 'except (NameError, e):' và được để lại với 'NameError' cho' 'e''! –

7

Nếu bạn muốn hỗ trợ tất cả các phiên bản python bạn có thể sử dụng Hàm sys.exc_info() như sau:

try: 
    a = 1/'0' 
except (ZeroDivisionError, TypeError): 
    e = sys.exc_info()[1] 
    print(e.args[0]) 

(nguồn: http://python3porting.com/noconv.html)

+1

Lưu ý: Có một số trường hợp góc ở đây cần lưu ý.Trong Py3, mục tiêu 'as' (cùng với phần còn lại của thông tin ngoại lệ) được ngầm định' del'ed ngay khi bạn thoát khỏi khối 'except' (điều này ngăn cản một số tham chiếu tuần hoàn liên quan đến truy xuất được lưu trữ từ trì hoãn việc giải phóng bộ nhớ cho đến khi GC tuần hoàn xung quanh để chạy). Vì vậy, mã tương đương này ít tương đương, trừ khi bạn sử dụng 'try/finally' trong khối' except' để đảm bảo 'del e' được thực hiện trước khi thoát khỏi khối' except'. – ShadowRanger