2012-07-01 12 views
24

Tôi muốn giữ & sử dụng giá trị lỗi của ngoại lệ trong cả Python 2.5, 2.7 và 3.2.thử ... ngoại trừ ... là lỗi trong Python 2.5 - Python 3.x

Trong Python 2.5 và 2.7 (nhưng không 3.x), các công trình này:

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), công trình này:

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

Is có bất kỳ mã nào cho mục đích này hoạt động ở cả 2.5, 2.7 và 3.2 không?

Cảm ơn

+0

Bạn có thể không nâng cấp 2.5 của bạn mã ít nhất là 2,7 và tốt hơn là 3? – Ben

+0

'ngoại trừ (ZeroDivisionError) là lỗi:' hoạt động tốt trong python 2.7 http://ideone.com/KfHBs –

+2

Python 3 rõ ràng là không tương thích ngược. Tại sao lại hạn chế bản thân với một tập con cú pháp hạn chế mà cả hai ngôn ngữ đều hỗ trợ? – Cameron

Trả lời

36

Bạn có thể sử dụng một mã cơ sở trên Pythons 2.5 đến 3.2, nhưng không dễ dàng. Bạn có thể xem coverage.py, chạy trên 2,3 đến 3,3 với một mã cơ sở duy nhất.

Cách để bắt một ngoại lệ và có được một tham chiếu đến các ngoại lệ mà làm việc trong tất cả trong số họ là thế này:

except ValueError: 
    _, err, _ = sys.exc_info() 
    #.. use err... 

này tương đương với:

except ValueError as err: 
    #.. use err... 
+0

hoạt động! Cảm ơn bạn! – user1492917

+1

Cấp nó hoạt động, nhưng có thể chữa bệnh tồi tệ hơn (xấu hơn) hơn là vấn đề. Một cách khác sẽ được sử dụng "như" và một kịch bản chuyển đổi mã khi đóng gói mã cho 2.5. YMMV. –

+0

Vấn đề là python thực hiện những thay đổi quan trọng và không cần thiết đối với cú pháp của nó giữa các phiên bản. Hãy tưởng tượng điều này trong C: từ phiên bản x.y bạn sử dụng "@" thay vì "{" :) Điều này thật đơn giản và chữa bệnh tốt hơn nhiều - sau khi tất cả chúng ta đều muốn nó hoạt động! – Terminus