2012-07-01 13 views
24

Chcę zachować & użyć wartości błędu wyjątku w obu Pythonie 2.5, 2.7 i 3.2.spróbuj ... z wyjątkiem ... jako błędu w Pythonie 2.5 - Python 3.x

W Pythonie 2.5 i 2.7 (ale nie 3.x) działa:

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

W Pythonie 2.7 i 3.2 (ale nie w 2.5), działa:

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

jest istnieje jakiś kod do tego celu, który działa w wersjach 2.5, 2.7 i 3.2?

Dzięki

+0

Czy nie można uaktualnić 2.5 kod do co najmniej 2,7, a najlepiej 3? – Ben

+0

'except (ZeroDivisionError) as error:' działa poprawnie w python 2.7 http://ideone.com/KfHBs –

+2

Python 3 nie jest wyraźnie kompatybilny wstecz. Po co ograniczać się do ograniczonego podzbioru składni obsługiwanego przez oba języki? – Cameron

Odpowiedz

36

można wykorzystywać jedną bazę kodu na pyton 2.5 przez 3.2, ale to nie jest łatwe. Możesz spojrzeć na coverage.py, która działa od 2.3 do 3.3 z jedną podstawą kodu.

Droga do połowu wyjątek i uzyskać odwołanie do wyjątku, który działa we wszystkich z nich to:

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

Jest to odpowiednik:

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

to działa! Dziękuję Ci! – user1492917

+1

To prawda, że ​​działa, ale może lekarstwo jest gorsze (brzydsze) niż problem. Innym sposobem byłoby użycie "as" i skryptu konwersji kodu przy pakowaniu kodu dla wersji 2.5. YMMV. –

+0

Problem polega na tym, że python dokonuje istotnych i niepotrzebnych zmian w swojej składni między wersjami. Wyobraź sobie to w C: od wersji x.y używasz "@" zamiast "{" :) To jest głupie i lekarstwo jest o wiele lepsze - w końcu wszyscy chcemy, żeby to działało! – Terminus

Powiązane problemy