Jak napisać try
/ except
blok, który przechwytuje wszystkie wyjątki?
sys.stderr
i ewentualnie rejestrowane. To doskonale ważny i powszechny wyjątek.
try: whatever() except Exception as e: exp_capture()
:?
Jak napisać try
/ except
blok, który przechwytuje wszystkie wyjątki?
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ś:
try:
do_something()
except:
print "Caught it!"
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 :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
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
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
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
i SystemExit
: jeśli je złapałeś i połknąłeś, możesz utrudnić każdemu wyjście ze skryptu.
Exception
. Zauważ, że nie można zgłosić int
wyjątku, a próba zrobienia tego powoduje TypeError
wyjątek, który except 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 podklasy Exception
- zostanie przechwycona przez zwykłą except
klauzulę, ale nie przez except 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
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
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
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
Ale jak wspomnieli inni, zwykle nie potrzebujesz tego, tylko w szczególnych przypadkach.
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. ”.
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
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!
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:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
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.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
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.
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
try:
whatever()
except:
# this will catch any exception or error
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ć.