Hướng dẫn try except python 2 vs 3 - thử ngoại trừ python 2 vs 3

Tôi muốn giữ và sử dụng giá trị lỗi của một ngoại lệ trong cả Python 2.5, 2.7 và 3.2.

Trong Python 2.5 và 2.7 (nhưng không phải 3.x), điều này hoạt động:

try:
    print(10 * (1/0))
except ZeroDivisionError,  error:       # old skool
    print("Yep, error caught:", error)

Trong Python 2.7 và 3.2 (nhưng không phải trong 2.5), điều này hoạt động:

try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)

Có mã nào cho mục đích này hoạt động trong cả 2.5, 2.7 và 3.2 không?

Cảm ơn

Các phiên bản Python rất sớm đã sử dụng các chuỗi đơn giản để có nghĩa là lỗi. Sau đó, Python cho phép nâng cao các lớp học tùy ý và thêm các lớp ngoại lệ chuyên dụng vào thư viện tiêu chuẩn. Vì lý do tương thích ngược, một số thực hành không dùng nữa vẫn được phép trong Python 2. Điều này thể hiện sự nhầm lẫn cho người học ngôn ngữ và ngăn chặn một số tối ưu hóa hiệu suất.

Python 3 loại bỏ các thực hành không dùng nữa. Nó cũng củng cố thêm mô hình ngoại lệ. Các trường hợp ngoại lệ hiện là các trường hợp của các lớp chuyên dụng và chứa tất cả thông tin về lỗi: loại, giá trị và dấu vết.

Chương này đề cập đến tất cả các thay đổi liên quan đến ngoại lệ cần thiết để bắt đầu hỗ trợ Python 3.

Cú pháp ____10 mới

  • Fixer:
    try:
        print(10 * (1/0))
    except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
        print("Yep, error caught:", error)
    
    1
    :
    try:
        print(10 * (1/0))
    except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
        print("Yep, error caught:", error)
    
    1
  • Tỷ lệ lưu hành: rất phổ biến

Trong Python 2, cú pháp để bắt các ngoại lệ là

try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
2 hoặc
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
3 khi các đối tượng ngoại lệ được mong muốn.
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
4 có thể là một tuple, như trong, ví dụ,
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
5.

Điều này có thể dẫn đến các lỗi khó có điểm: lệnh

try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
6 (lưu ý thiếu dấu ngoặc đơn) sẽ chỉ xử lý
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
7. Nó cũng sẽ gán đối tượng ngoại lệ cho tên
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
8, theo dõi tích hợp.

Để khắc phục điều này, Python 2.6 đã giới thiệu một cú pháp thay thế:

try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
9. Trong Python 3, cú pháp cũ không còn được phép.

Bạn sẽ cần chuyển sang cú pháp mới. Fixer được đề xuất hoạt động khá đáng tin cậy và nó cũng khắc phục vấn đề ngoại lệ lặp lại được mô tả dưới đây.Iterating Exceptions problem described below.

Cú pháp raise ValueError, 'invalid input' raise ValueError, 'invalid input', some_traceback 0 mới

  • Fixer:
    raise ValueError, 'invalid input'
    raise ValueError, 'invalid input', some_traceback
    
    1
    :
    raise ValueError, 'invalid input'
    raise ValueError, 'invalid input', some_traceback
    
    1
  • Tỷ lệ lưu hành: chung

Tuyên bố của Python 2, ____ ____20 được thiết kế vào thời điểm các trường hợp ngoại lệ của các lớp và một loại ngoại lệ, các thành phần giá trị và tracback là ba đối tượng riêng biệt:

raise ValueError, 'invalid input'
raise ValueError, 'invalid input', some_traceback

Trong Python 3, một đối tượng duy nhất bao gồm tất cả thông tin về một ngoại lệ:

raise ValueError('invalid input')

e = ValueError('invalid input')
e.__traceback__ = some_traceback
raise e

Python 2.6 cho phép biến thể đầu tiên. Đối với lần thứ hai, tái tạo lại một ngoại lệ, thư viện tương thích: Six Library bao gồm một trình bao bọc tiện lợi hoạt động trong cả hai phiên bản:Compatibility library: six library includes a convenience wrapper that works in both versions:

import six
six.reraise(ValueError, 'invalid input',  some_traceback)

Các trình sửa chữa được đề xuất sẽ tự động thực hiện các chuyển đổi này và khá đáng tin cậy, nhưng hãy xác minh các thay đổi kết quả.

Bị bắt gặp ngoại lệ "phạm vi"

  • FIXER: Không có: None
  • Tỷ lệ lưu hành: Hiếm

Như đã thảo luận trước đây, trong Python 3, tất cả thông tin về một ngoại lệ, bao gồm cả dấu vết, được chứa trong đối tượng ngoại lệ. Do Traceback giữ các tham chiếu đến các giá trị của tất cả các biến cục bộ, việc lưu trữ một ngoại lệ trong một biến cục bộ thường tạo thành một chu kỳ tham chiếu, giữ cho tất cả các biến cục bộ được phân bổ cho đến khi thông qua bộ sưu tập rác tiếp theo.discussed previously, in Python 3, all information about an exception, including the traceback, is contained in the exception object. Since the traceback holds references to the values of all local variables, storing an exception in a local variable usually forms a reference cycle, keeping all local variables allocated until the next garbage collection pass.

Để ngăn chặn vấn đề này, để trích dẫn từ tài liệu Python,:Python’s documentation:

Khi một ngoại lệ đã được chỉ định bằng cách sử dụng làm mục tiêu, nó sẽ được xóa ở cuối mệnh đề ngoại trừ. Điều này là như thể

đã được dịch sang

except E as N:
    try:
        foo
    finally:
        del N

Điều này có nghĩa là ngoại lệ phải được gán cho một tên khác để có thể tham khảo nó sau mệnh đề ngoại trừ.

Thật không may, Fix Trình sửa chữa tự động: Python-Modernize không cung cấp bộ sửa lỗi cho thay đổi này. Vấn đề này dẫn đến một

raise ValueError, 'invalid input'
raise ValueError, 'invalid input', some_traceback
3 lớn khi các bài kiểm tra được chạy. Khi bạn thấy lỗi này, hãy áp dụng bản sửa lỗi được đề xuất - gán một tên khác cho ngoại lệ để sử dụng nó bên ngoài mệnh đề ____1010.Automated fixer: python-modernize does not provide a fixer for this change. This issue results in a loud
raise ValueError, 'invalid input'
raise ValueError, 'invalid input', some_traceback
3 when tests are run. When you see this error, apply the recommended fix – assign a different name to the exception to use it outside the
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
0 clause.

Lặp lại ngoại lệ

  • FIXER:
    try:
        print(10 * (1/0))
    except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
        print("Yep, error caught:", error)
    
    1 (nhưng xem hãy cẩn thận bên dưới)
    :
    try:
        print(10 * (1/0))
    except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
        print("Yep, error caught:", error)
    
    1 (but see caveat below)
  • Tỷ lệ lưu hành: Hiếm

Như đã thảo luận trước đây, trong Python 3, tất cả thông tin về một ngoại lệ, bao gồm cả dấu vết, được chứa trong đối tượng ngoại lệ. Do Traceback giữ các tham chiếu đến các giá trị của tất cả các biến cục bộ, việc lưu trữ một ngoại lệ trong một biến cục bộ thường tạo thành một chu kỳ tham chiếu, giữ cho tất cả các biến cục bộ được phân bổ cho đến khi thông qua bộ sưu tập rác tiếp theo.

except RuntimeError as (num, message):

Để ngăn chặn vấn đề này, để trích dẫn từ tài liệu Python,:

except RuntimeError as e:
    num, message = e.args

Khi một ngoại lệ đã được chỉ định bằng cách sử dụng làm mục tiêu, nó sẽ được xóa ở cuối mệnh đề ngoại trừ. Điều này là như thể

đã được dịch sang

except RuntimeError as (num, message): pass

Kiểm tra đầu ra và chia chúng thành nhiều dòng theo cách thủ công.

Nâng cao các trường hợp không

  • FIXER: Không có: None
  • Tỷ lệ lưu hành: Hiếm

Trong Python 3, một đối tượng được sử dụng với

raise ValueError, 'invalid input'
raise ValueError, 'invalid input', some_traceback
0 phải là một ví dụ là
raise ValueError('invalid input')

e = ValueError('invalid input')
e.__traceback__ = some_traceback
raise e
1, trong khi Python 2 cũng cho phép các lớp kiểu cũ. Tương tự, Python 3 cấm bắt các lớp không Exception trong câu lệnh
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
0.

Tăng các lớp không phải là đã lỗi thời sớm nhất là trong Python 2.0, nhưng mã vẫn có thể được tìm thấy.

Mỗi trường hợp cần được xử lý bằng tay. Nếu có một lớp chuyên dụng cho ngoại lệ, hãy làm cho nó kế thừa từ

raise ValueError('invalid input')

e = ValueError('invalid input')
e.__traceback__ = some_traceback
raise e
3. Nếu không, chuyển sang sử dụng một lớp ngoại lệ chuyên dụng.

________ 34¶ bị loại bỏ

  • Fixer:
    raise ValueError('invalid input')
    
    e = ValueError('invalid input')
    e.__traceback__ = some_traceback
    raise e
    
    5 (nhưng xem hãy cẩn thận bên dưới)
    :
    raise ValueError('invalid input')
    
    e = ValueError('invalid input')
    e.__traceback__ = some_traceback
    raise e
    
    5 (but see caveat below)
  • Tỷ lệ lưu hành: Hiếm

Trong Python 3, một đối tượng được sử dụng với

raise ValueError, 'invalid input'
raise ValueError, 'invalid input', some_traceback
0 phải là một ví dụ là
raise ValueError('invalid input')

e = ValueError('invalid input')
e.__traceback__ = some_traceback
raise e
1, trong khi Python 2 cũng cho phép các lớp kiểu cũ. Tương tự, Python 3 cấm bắt các lớp không Exception trong câu lệnh
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
0.

Tăng các lớp không phải là đã lỗi thời sớm nhất là trong Python 2.0, nhưng mã vẫn có thể được tìm thấy.

Mỗi trường hợp cần được xử lý bằng tay. Nếu có một lớp chuyên dụng cho ngoại lệ, hãy làm cho nó kế thừa từ

raise ValueError('invalid input')

e = ValueError('invalid input')
e.__traceback__ = some_traceback
raise e
3. Nếu không, chuyển sang sử dụng một lớp ngoại lệ chuyên dụng.

________ 34¶ bị loại bỏ

  • FIXER: Không có: None
  • Tỷ lệ lưu hành: Hiếm

Trong Python 3, một đối tượng được sử dụng với

raise ValueError, 'invalid input'
raise ValueError, 'invalid input', some_traceback
0 phải là một ví dụ là
raise ValueError('invalid input')

e = ValueError('invalid input')
e.__traceback__ = some_traceback
raise e
1, trong khi Python 2 cũng cho phép các lớp kiểu cũ. Tương tự, Python 3 cấm bắt các lớp không Exception trong câu lệnh
try:
    print(10 * (1/0))
except (ZeroDivisionError) as error:    # 'as' is needed by Python 3
    print("Yep, error caught:", error)
0.

Tăng các lớp không phải là đã lỗi thời sớm nhất là trong Python 2.0, nhưng mã vẫn có thể được tìm thấy.

Mỗi trường hợp cần được xử lý bằng tay. Nếu có một lớp chuyên dụng cho ngoại lệ, hãy làm cho nó kế thừa từ

raise ValueError('invalid input')

e = ValueError('invalid input')
e.__traceback__ = some_traceback
raise e
3. Nếu không, chuyển sang sử dụng một lớp ngoại lệ chuyên dụng.

Có một sự khác biệt lớn giữa Python 2 và 3?

Python 3 có cú pháp dễ dàng hơn so với Python 2. Rất nhiều thư viện của Python 2 không tương thích về phía trước. Rất nhiều thư viện được tạo ra trong Python 3 để được sử dụng nghiêm ngặt với Python 3. Python 2 không còn được sử dụng kể từ năm 2020.. A lot of libraries of Python 2 are not forward compatible. A lot of libraries are created in Python 3 to be strictly used with Python 3. Python 2 is no longer in use since 2020.

Sự khác biệt giữa Python 2 và Python 3 là gì?

Python 3 theo yêu cầu nhiều hơn và bao gồm một hệ thống gõ.Python 2 đã lỗi thời và sử dụng cú pháp cũ hơn cho chức năng in. Mặc dù Python 2 vẫn đang được sử dụng để quản lý cấu hình trong DevOps, Python 3 là tiêu chuẩn hiện tại. Python (mã, không phải rắn) là ngôn ngữ mã hóa phổ biến để học cho người mới bắt đầu. Python 2 is outdated and uses an older syntax for the print function. While Python 2 is still in use for configuration management in DevOps, Python 3 is the current standard. Python (the code, not the snake) is a popular coding language to learn for beginners.

Làm thế nào để bạn biết nếu một tập lệnh là Python 2 hoặc 3?

Nếu bạn muốn xác định xem python2 hay python3 đang chạy, bạn có thể kiểm tra phiên bản chính với sys.version_info.major này.2 có nghĩa là python2 và 3 có nghĩa là python3.sys. version_info. major . 2 means Python2, and 3 means Python3.

Sự khác biệt chính giữa Python 2 và 3 là gì?

Cú pháp Python 3 đơn giản hơn và dễ hiểu hơn trong khi cú pháp Python 2 tương đối khó hiểu.Python 3 Lưu trữ mặc định các chuỗi là Unicode trong khi các cửa hàng Python 2 cần xác định giá trị chuỗi unicode với U.