Подтвердить что ты не робот

Захват всех исключений в Python

В Python, какой лучший способ поймать "все" исключения?

except: # do stuff with sys.exc_info()[1]

except BaseException as exc:

except Exception as exc:

Уловка может выполняться в потоке.

Моя цель - регистрировать любое исключение, которое может быть вызвано обычным кодом без маскировки каких-либо особых исключений Python, таких как те, которые указывают на завершение процесса и т.д.

Получение дескриптора исключения (например, по вышеприведенным предложениям, содержащим exc).

4b9b3361

Ответ 1

Если вам нужно поймать все исключения и сделать то же самое для всех, я предлагаю вам следующее:

try:
   #stuff
except:
   # do some stuff

Если вы не хотите маскировать "особые" исключения python, используйте базовый класс Exception

try:
   #stuff
except Exception:
   # do some stuff

для некоторых исключений, связанных с управлением, поймать их явно:

try:
   #stuff
except FirstExceptionBaseClassYouWantToCatch as exc:
   # do some stuff
except SecondExceptionBaseClassYouWantToCatch as exc:
   # do some other stuff based
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc:
   # do some other stuff based

иерархия исключений из документов python должна быть полезной.

Ответ 2

  • except Exception: vs except BaseException::

    Разница между улавливанием Exception и BaseException заключается в том, что в соответствии с исключение иерархии исключение, такое как SystemExit, KeyboardInterrupt и GeneratorExit не будет пойманы при использовании except Exception, потому что они наследуют непосредственно из BaseException.

  • except: vs except BaseException::

    Разница между этими двумя в основном связана с python 2 (AFAIK), и только при использовании старого класса стиля в качестве исключения, которое должно быть поднято, в этом случае исключение исключающего исключения исключает, например,.

    class NewStyleException(Exception): pass
    
    try:
       raise NewStyleException
    except BaseException:
       print "Caught"
    
    class OldStyleException: pass
    
    try:
       raise OldStyleException
    except BaseException:
       print "BaseException caught when raising OldStyleException"
    except:
       print "Caught"
    

Ответ 3

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

import sys

попробовать:   # сделать что-то, что может вызвать исключение: кроме IOError as (errno, strerror):   print "Ошибка ввода-вывода ({0}): {1}". format (errno, strerror) кроме ValueError:   print "Не удалось преобразовать данные в целое число". Кроме:   # может регистрировать исключение (например, в режиме отладки)   # re-raise исключение:   повышение