Python dùng thử ngoại trừ dấu phẩy so với 'như' trong ngoại trừ


246

Sự khác biệt giữa ',' và 'as' trong các câu lệnh ngoại trừ, ví dụ:

try:
    pass
except Exception, exception:
    pass

và:

try:
    pass
except Exception as exception:
    pass

Là cú pháp thứ hai hợp pháp trong 2.6? 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 tôi nên sử dụng?

Câu trả lời:


284

Tài liệu dứt khoát là PEP-3110: Bắt ngoại lệ

Tóm lược:

  • Trong Python 3.x, việc sử dụng asbắt buộc để gán ngoại lệ cho một biến.
  • Trong Python 2.6+, hãy sử dụng ascú pháp, vì nó ít mơ hồ hơn 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ì askhông được hỗ trợ.

16
Sử dụng aslà cách duy nhất để gán ngoại lệ cho một cục bộ trong Python 3.x. Nhưng askhông bắt buộc , vì bạn không phải chỉ định nó nếu bạn không cần nó.
Mercator

38

Vâng, đó là 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ó một lý do khác để sử dụng ascú pháp. Sử dụng ,làm cho mọi thứ mơ hồ hơn rất nhiều, như những người khác đã chỉ ra; và đây là những gì làm nên sự khác biệt. Kể từ Python 2.6, có multicatchcho phép bạn bắt được nhiều ngoại lệ trong một exceptkhối . Trong tình huống như vậy, nó có ý nghĩa và biểu cảm hơn

except (exception1, exception2) as e

thay vì nói

except (exception1, exception2), e

mà vẫn sẽ làm việc


13
Các phiên bản Python trước 2.6 cho phép bạn sử dụng bộ dữ liệu để bắt nhiều loại ngoại lệ. Nhưng cú pháp khó hiểu; bạn sẽ sử dụng except NameError, ValueError:sau đó tự hỏi tại sao ValueErrorngoại lệ không bao giờ bị bắt. Hoặc được sử dụng except (NameError, e):và được để lại NameErrorcho 'e'!
Martijn Pieters

17

cú pháp "as" là cú pháp ưa thích trong tương lai, tuy nhiên nếu mã của bạn cần hoạt động 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 sẽ cần sử dụng cú pháp dấu phẩy.


9

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 sys.exc_info()chức năng như thế này:

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

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


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

0

Kể từ Python 3.7 (không chắc chắn về các phiên bản khác), cú pháp 'dấu phẩy' không được hỗ trợ nữa:

Nguồn tập tin exception_comma.py:

try:
    result = 1/0
except Exception, e:
    print("An error occurred")
    exit(1)

exit(0)
  • $ python --version --> Python 2.7.10
$ python exception_comma.py
An error occurred
  • $ python3 --version --> Python 3.7.2
$ python3 exception_comma.py
  File "exception_comma.py", line 3
    except Exception, e:
                    ^
SyntaxError: invalid syntax
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.