О ловле ЛЮБОГО исключения - PullRequest
584 голосов
/ 14 февраля 2011

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

Ответы [ 8 ]

691 голосов
/ 14 февраля 2011

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

484 голосов
/ 14 февраля 2011

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

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
91 голосов
/ 14 июля 2013

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

try:
    a = 2/0
except Exception as e:
    print e.__doc__
    print e.message
49 голосов
/ 14 февраля 2011

Очень простой пример, подобный найденному здесь:

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) "Исключение было выброшено!" или "Все выглядит отлично!" в зависимости от того, было ли выдано исключение.

Надеюсь, это поможет!

48 голосов
/ 24 июля 2015

Чтобы поймать все возможные исключения, поймать 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))

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

15 голосов
/ 28 ноября 2016

Я только что обнаружил этот маленький трюк для проверки имен исключений в Python 2.7. Иногда я обрабатывал определенные исключения в коде, поэтому мне нужно было проверить, находится ли это имя в списке обработанных исключений.

try:
    raise IndexError #as test error
except Exception as e:
    excepName = type(e).__name__ # returns the name of the exception
10 голосов
/ 28 января 2019

Есть несколько способов сделать это, в частности, с 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()
4 голосов
/ 14 февраля 2011
try:
    whatever()
except:
    # this will catch any exception or error

Стоит отметить, что это неправильное кодирование Python.Это также поймает много ошибок, которые вы, возможно, не захотите поймать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...