Jaka jest różnica między „,” a „jak” w instrukcjach z wyjątkiem, np .:
try:
pass
except Exception, exception:
pass
i:
try:
pass
except Exception as exception:
pass
Czy druga składnia jest legalna w wersji 2.6? Działa w CPython 2.6 w systemie Windows, ale interpreter 2.5 w cygwin skarży się, że jest nieprawidłowy.
Jeśli oba są ważne w 2.6, którego powinienem użyć?
python
python-2.6
Peter Graham
źródło
źródło
as
jest jedynym sposobem przypisania wyjątku do lokalnego w Pythonie 3.x. Aleas
nie jest to wymagane , ponieważ nie musisz go określać, jeśli w ogóle go nie potrzebujesz.Tak, to legalne. Korzystam z języka Python 2.6
Aktualizacja : Istnieje inny powód, aby użyć
as
składni. Używanie,
czyni rzeczy o wiele bardziej niejednoznacznymi, jak zauważyli inni; i oto, co robi różnicę. Począwszy od wersji Python 2.6 istniejemulticatch
możliwość przechwycenia wielu wyjątków w jednymexcept
bloku . W takiej sytuacji jest to bardziej wyraziste i pytonicznezamiast powiedzieć
co nadal działałoby
źródło
except NameError, ValueError:
wtedy, zastanawiałeś się, dlaczegoValueError
wyjątek nigdy nie został złapany. Lub wykorzystywaneexcept (NameError, e):
i zostały pozostawione zNameError
za'e'
!preferowana jest składnia „as”, jednak jeśli twój kod musi współpracować ze starszymi wersjami języka Python (2.6 obsługuje pierwszą wersję), musisz użyć składni przecinków.
źródło
Jeśli chcesz obsługiwać wszystkie wersje Pythona, możesz użyć
sys.exc_info()
funkcji w następujący sposób:(źródło: http://python3porting.com/noconv.html )
źródło
as
cel (wraz z resztą informacji o wyjątku) jest domyślnie edytowanydel
natychmiast po wyjściu zexcept
bloku (zapobiega to opóźnieniu zwolnienia pamięci przez niektóre cykliczne odwołania związane z przechowywanym śledzeniem), dopóki cykliczny GC nie zacznie działać ). Więc ten równoważny kod jest nieco mniej równoważny, chyba że użyjesztry/finally
wewnątrzexcept
bloku, aby upewnić się, żedel e
jest wykonywany przed wyjściem zexcept
bloku.Od wersji Python 3.7 (nie jestem pewien co do innych wersji) składnia „przecinków” nie jest już obsługiwana:
Plik źródłowy
exception_comma.py
:$ python --version --> Python 2.7.10
$ python3 --version --> Python 3.7.2
źródło