Oba poniższe fragmenty kodu robią to samo. Wychwytują każdy wyjątek i wykonują kod w except:
bloku
Fragment 1 -
try:
#some code that may throw an exception
except:
#exception handling code
Fragment 2 -
try:
#some code that may throw an exception
except Exception as e:
#exception handling code
Jaka jest dokładnie różnica w obu konstrukcjach?
python
python-3.x
narendranathjoshi
źródło
źródło
except Exception, e:
iexcept Exception as e:
. To pytanie dotyczy różnicy międzyexcept:
iexcept Exception as e:
.Odpowiedzi:
W drugim możesz uzyskać dostęp do atrybutów obiektu wyjątku:
Ale to nie złapać
BaseException
lub wyjątki przez system zamykaniaSystemExit
,KeyboardInterrupt
iGeneratorExit
:Który nagi z wyjątkiem robi:
Aby uzyskać więcej informacji, zobacz sekcję Wbudowane wyjątki w dokumentacji oraz sekcję Błędy i wyjątki w samouczku.
źródło
Exception
pochodzi zBaseException
, dlategoexcept Exception
nie łapieBaseException
. Jeśli napiszeszexcept BaseException
, też zostaniesz złapany. Bareexcept
po prostu łapie wszystko.except
musi być ostatnie w seriiexcept
bloków, podczas gdy nie otrzymasz błędu, jeśli umieścisz jeexcept Exception
przed innymiexcept
blokami: po prostu zostaną zignorowane po cichu (jeśli obsługująException
podklasy). Coś, na co trzeba uważać.except
iexcept Exception
. „Coś, na co trzeba uważać” wygląda teraz trochę dziwnie, ale wtedy spodziewałem się, że Python wybierze najbardziej specyficznyexcept
blok, niezależnie od tego, gdzie się znajduje, i byłem trochę rozczarowany, gdy dowiedziałem się, że jest inaczej.akceptuje wszystkie wyjątki, podczas gdy
akceptuje tylko wyjątki, że jesteś oznaczało do połowu.
Oto przykład takiego, którego nie powinieneś złapać:
Pierwszy uciszył
KeyboardInterrupt
!Oto krótka lista:
Jeśli chcesz złapać którykolwiek z nich, najlepiej to zrobić
wskazać, że wiesz, co robisz.
Wszystkie wyjątki pochodzą od
BaseException
, a te, które masz codziennie łapać (te, które zostaną wyrzucone dla programisty) również dziedzicząException
.źródło
except(Exception)
nigdy nie wyłapujeKeyboardInterrupt
błędów.as e
nie ma z tym nic wspólnego.as e
, bo zakładałem, że to oczywiste.SystemExit
lubKeyboardInterrupt
od których uciekały. Nie jest to częsty przypadek, ale zdarza się.Istnieją różnice z pewnymi wyjątkami, np. KeyboardInterrupt.
Czytanie PEP8 :
źródło
Użycie drugiego formularza daje zmienną (nazwaną na podstawie
as
klauzuli, w twoim przykładziee
) w zakresieexcept
blokowym z powiązanym z nią obiektem wyjątku, dzięki czemu możesz użyć informacji w wyjątku (typ, wiadomość, ślad stosu itp.) zajmij się wyjątkiem w bardziej specjalnie dostosowanym dworze.źródło
Inny sposób spojrzenia na to. Sprawdź szczegóły wyjątku:
Istnieje wiele „rzeczy”, do których można uzyskać dostęp za pomocą składni „as e”.
Ten kod miał na celu wyłącznie pokazanie szczegółów tej instancji.
źródło