Перехват всех исключений в Python - PullRequest
22 голосов
/ 23 августа 2011

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

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

except BaseException as exc:

except Exception as exc:

Возможно, перехват выполняется в потоке.

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

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

Ответы [ 3 ]

33 голосов
/ 23 августа 2011
  • except Exception: против except BaseException::

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

  • except: против 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"
    
22 голосов
/ 23 августа 2011

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

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 должна быть полезной для чтения.

0 голосов
/ 23 августа 2011

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

import sys

try:
    # do something that could throw an exception:
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:
    # maybe log the exception (e.g. in debug mode)
    # re-raise the exception:
    raise
...