Jak napisać try
/ except
blok, który przechwytuje wszystkie wyjątki?
python
exception-handling
użytkownik469652
źródło
źródło
sys.stderr
i ewentualnie rejestrowane. To doskonale ważny i powszechny wyjątek.try: whatever() except Exception as e: exp_capture()
:?Odpowiedzi:
Możesz, ale prawdopodobnie nie powinieneś:
Będzie to jednak wychwytywało wyjątki takie jak
KeyboardInterrupt
i zwykle tego nie chcesz, prawda? Chyba że od razu podniesiesz wyjątek - zobacz następujący przykład z dokumentacji :źródło
except Exception:
że goły, z wyjątkiem tego, że tam również złapie wyjątki BaseException.Oprócz samej
except:
klauzuli (której, jak twierdzili inni, nie powinieneś używać), możesz po prostu złapaćException
:Zwykle rozważasz zrobienie tego na zewnętrznym poziomie kodu, jeśli na przykład chcesz obsłużyć wszelkie nieprzechwycone wyjątki przed zakończeniem.
Zaletą
except Exception
nad gołąexcept
jest to, że istnieje kilka wyjątków, których nie można złapać, oczywiścieKeyboardInterrupt
iSystemExit
: jeśli je złapałeś i połknąłeś, możesz utrudnić każdemu wyjście ze skryptu.źródło
Exception
. Zauważ, że nie można zgłosićint
wyjątku, a próba zrobienia tego powodujeTypeError
wyjątek, któryexcept Exception
w takim przypadku zostałby złapany przez klauzulę załączającą . Z drugiej strony, klasę w starym stylu można podnieść i zakwalifikować jako „nie-wyjątek”, który nie zalicza się do podklasyException
- zostanie przechwycona przez zwykłąexcept
klauzulę, ale nie przezexcept Exception
klauzulę.TypeError
sys.exit()
zwykle oznacza, że oczekujesz zakończenia aplikacji, ale jeśli złapiesz SystemExit, nie nastąpi. Podobnie, jeśli naciśniesz Control-C na działającym skrypcie (Ctrl-break w systemie Windows), spodziewasz się, że program się zatrzyma, nie złapie błędu i nie przestanie działać. Ale możesz złapać jedno lub oba z nich, jeśli chcesz zrobić porządki przed ich istnieniem.Możesz to zrobić, aby obsłużyć ogólne wyjątki
źródło
Aby złapać wszystkie możliwe wyjątki, złap
BaseException
. Jest na szczycie hierarchii wyjątków:Python 3: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
Ale jak wspomnieli inni, zwykle nie potrzebujesz tego, tylko w szczególnych przypadkach.
źródło
Bardzo prosty przykład, podobny do tego tutaj:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Jeśli próbujesz wyłapać WSZYSTKIE wyjątki, umieść cały kod w instrukcji „try:” zamiast „print”. Wykonanie czynności, która może spowodować wyjątek. ”.
W powyższym przykładzie wynik byłby wyświetlany w następującej kolejności:
1) Wykonanie czynności, która może spowodować wyjątek.
2) Wreszcie wywoływany jest bezpośrednio po wykonaniu instrukcji try, niezależnie od tego, czy zgłoszony zostanie wyjątek.
3) „Zgłoszono wyjątek!” lub „Wszystko wygląda świetnie!” w zależności od tego, czy został zgłoszony wyjątek.
Mam nadzieję że to pomoże!
źródło
Można to zrobić na wiele sposobów, w szczególności w przypadku języka Python 3.0 i nowszych wersji
Podejście 1
Jest to proste podejście, ale niezalecane, ponieważ nie wiadomo dokładnie, który wiersz kodu zgłasza wyjątek:
Podejście 2
Takie podejście jest zalecane, ponieważ zapewnia więcej szczegółów na temat każdego wyjątku. Obejmuje:
Jedyną wadą jest to, że tracback musi zostać zaimportowany.
źródło
Właśnie odkryłem tę małą sztuczkę do testowania nazw wyjątków w Pythonie 2.7. Czasami obsłużyłem określone wyjątki w kodzie, więc potrzebowałem testu, aby sprawdzić, czy ta nazwa znajduje się na liście obsługiwanych wyjątków.
źródło
Warto wspomnieć, że nie jest to właściwe kodowanie w języku Python. Spowoduje to również wychwycenie wielu błędów, których możesz nie chcieć.
źródło