ловит все кроме специфического исключения в питоне - PullRequest
2 голосов
/ 14 мая 2019

У меня есть кодовая база с кодом, подобным следующему:

try:
    do_stuff()
except:
    print "yes, it's catching EVERYTHING"

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

Это делает отладку адом.

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

Возможно ли это?поймать все, НО какие-то конкретные исключения?

спасибо!

1 Ответ

4 голосов
/ 14 мая 2019

вы можете сделать следующее:

try:
    do_stuff()
except (SyntaxError, <any other exception>):
    raise  # simply raises the catched exception
except Exception:
    print "yes, it's catching EVERYTHING"

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


Обратите внимание, что, как указано в комментарии ниже @tobias_k, SyntaxError обнаруживается до фактического запуска сценария, поэтому его не следуетнужно было поймать его.

Для испытания я искал способ действительно поймать SyntaxError, и единственный случай, который я обнаружил, - это следующее (но есть и другие случаи, см. комментарий @ brunodesthuilliers):

try:
    eval(input('please enter some Python code: '))
except SyntaxError:
    print('oh yeah!')
$ python syntax_error.py
please enter some Python code: /
oh yeah!

Мой вывод таков: если вам нужно поймать SyntaxError, это означает, что ваша кодовая база делает некоторые вещи даже хуже, чем вы показали нам ... Я желаю вам много мужества;)

...