Как я могу написать try
/ except
блок, который перехватывает все исключения?
sys.stderr
и, возможно, регистрируются. Это вполне допустимое и распространенное исключение.
try: whatever() except Exception as e: exp_capture()
:?
Как я могу написать try
/ except
блок, который перехватывает все исключения?
sys.stderr
и, возможно, регистрируются. Это вполне допустимое и распространенное исключение.
try: whatever() except Exception as e: exp_capture()
:?
Ответы:
Вы можете, но, вероятно, не должны:
try:
do_something()
except:
print "Caught it!"
Тем не менее, это также будет ловить исключения, как, KeyboardInterrupt
и вы обычно не хотите этого, не так ли? Если вы повторно не вызвали исключение сразу - посмотрите следующий пример из документации :
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:
что «голое», за исключением того, что у вас есть, также поймает BaseException.
Помимо except:
простого предложения (которое, как говорили другие, не следует использовать), вы можете просто уловить Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
Обычно вы всегда рассматриваете возможность сделать это на самом внешнем уровне вашего кода, если, например, вы хотите обработать любые иные необработанные исключения перед завершением.
Преимущество except Exception
над голым except
состоит в том, что есть несколько исключений, которые он не поймает, наиболее очевидно KeyboardInterrupt
и SystemExit
: если вы поймали и проглотили их, вы могли бы затруднить кому-либо выход из сценария.
Exception
. Обратите внимание, что невозможно вызвать int
исключение, и при попытке сделать это возникает TypeError
исключение, которое except Exception
в таком случае будет включено вмещающее предложение. С другой стороны, класс старого стиля может быть поднят и квалифицируется как «не-исключение» , который не подкласс Exception
- это будет пойман на голом except
пункт , но не с помощью except Exception
пункта.
TypeError
sys.exit()
обычно означает, что вы ожидаете, что приложение завершит работу, но если вы поймаете SystemExit, оно не будет. Аналогично, если вы нажмете control-C на работающем скрипте (Ctrl-break на окнах), вы ожидаете, что программа остановится, чтобы не перехватить ошибку и продолжить работу. Но вы можете поймать любой / оба из них, если вы хотите сделать очистку перед существующим.
Вы можете сделать это для обработки общих исключений
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
Чтобы поймать все возможные исключения, поймать BaseException
. Это на вершине иерархии исключений:
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))
Но, как упоминали другие люди, это обычно не требуется, только для особых случаев.
Очень простой пример, похожий на найденный здесь:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Если вы пытаетесь перехватить ВСЕ исключения, поместите весь свой код в оператор «try:» вместо «print» Выполнение действия, которое может вызвать исключение. ».
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."
В приведенном выше примере вы увидите вывод в следующем порядке:
1) Выполнение действия, которое может вызвать исключение.
2) И, наконец, вызывается непосредственно после выполнения оператора try независимо от того, было ли выброшено исключение.
3) «Исключение было брошено!» или "Все выглядит отлично!" в зависимости от того, было ли выброшено исключение.
Надеюсь это поможет!
Есть несколько способов сделать это, в частности, с Python 3.0 и выше
Подход 1
Это простой подход, но он не рекомендуется, потому что вы не знаете точно, какая строка кода вызывает исключение:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
Подход 2
Этот подход рекомендуется, потому что он предоставляет более подробную информацию о каждом исключении. Это включает в себя:
Единственным недостатком является необходимость импорта tracback.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
Я только что обнаружил этот маленький трюк для проверки имен исключений в Python 2.7. Иногда я обрабатывал определенные исключения в коде, поэтому мне нужно было проверить, находится ли это имя в списке обработанных исключений.
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
Стоит отметить, что это неправильное кодирование Python. Это также поймает много ошибок, которые вы можете не захотеть поймать.