Вопрос-Ответ

How can I write a `try`/`except` block that catches all exceptions?

Как я могу написать блок `try` / `except`, который улавливает все исключения?

Как я могу написать try/except блок, который улавливает все исключения?

Переведено автоматически
Ответ 1

Помимо простого 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: если вы их поймаете и проглотите, то вы можете затруднить выход из вашего скрипта кому бы то ни было.

Ответ 2

Вы можете, но, вероятно, не должны:

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
Ответ 3

Чтобы перехватить все возможные исключения, используйте catch BaseException. Он находится на вершине иерархии классов исключений:

Python 3: https://docs.python.org/3.12/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))

Но, как упоминали другие люди, обычно вам это не нужно, только для очень специфических случаев.

Ответ 4

Вы можете сделать это для обработки общих исключений

try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
python