it-swarm-ru.tech

О ловле ЛЮБОГО исключения

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

570
user469652

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

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
471
Tim Pietzcker

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

682
Duncan

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

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

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

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
Joshua Burns

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

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

46
gitaarik

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

try:
    raise IndexError #as test error
except Exception as e:
    excepName = type(e).__# returns the name of the exception
14
Danilo

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

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

4
Yuval Adam