Не работает try...except с argparse

Следующий код должен принимать параметр с аргументом. Если у параметра не задали аргумент, то должна отловиться ошибка в блоке except, но этого не происходит. При этом блок finally отрабатывает.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-a', type=int)
try:
    args = parser.parse_args(['-a']) #Здесь ожидается аргумент, но мы его намеренно не передали
    print(args)
except Exception as e:
    print('Exception: %s'%(e))
finally:
    print('Finally section works')
print('End of code')

При выполнении кода на выходе видим, что блок except не отработал:

usage: t.py [-h] [-a A]
t.py: error: argument -a: expected one argument
Finally section works

Почему это происходит?


Ответы (1 шт):

Автор решения: CrazyElf

Смотрим, что выводит ваш код среди прочего (по крайней мере в Google Colab):

SystemExit: 2

Ага, значит argparse бросает не обычное исключение, а SystemExit, которое не унаследовано от Exception. Поймать это исключение можно, если указать, что мы хотим ловить:

  • SystemExit
  • BaseException

То есть вот так исключение поймается и программа доработает до конца:

except SystemExit as e:

И так тоже:

except BaseException as e:

Как сказано в приведённой мной ссылке, так сделано специально, чтобы случайно не поймать исключение SystemExit типовым блоком программы except Exception as e:, всё-таки это особое исключение и ловить его нужно сознательно.

→ Ссылка