Не работает 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 шт):
Смотрим, что выводит ваш код среди прочего (по крайней мере в Google Colab):
SystemExit: 2
Ага, значит argparse бросает не обычное исключение, а SystemExit, которое не унаследовано от Exception. Поймать это исключение можно, если указать, что мы хотим ловить:
SystemExitBaseException
То есть вот так исключение поймается и программа доработает до конца:
except SystemExit as e:
И так тоже:
except BaseException as e:
Как сказано в приведённой мной ссылке, так сделано специально, чтобы случайно не поймать исключение SystemExit типовым блоком программы except Exception as e:, всё-таки это особое исключение и ловить его нужно сознательно.