Захват всех исключений в Python
В Python, какой лучший способ поймать "все" исключения?
except: # do stuff with sys.exc_info()[1]
except BaseException as exc:
except Exception as exc:
Уловка может выполняться в потоке.
Моя цель - регистрировать любое исключение, которое может быть вызвано обычным кодом без маскировки каких-либо особых исключений Python, таких как те, которые указывают на завершение процесса и т.д.
Получение дескриптора исключения (например, по вышеприведенным предложениям, содержащим exc
).
Ответы
Ответ 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 исключение: повышение