Сценарий Python завершается с кодом выхода 255, несмотря на блок try-Кроме - PullRequest
1 голос
/ 30 апреля 2019

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

Например, код использует API для взаимодействия с другим программным обеспечением. Это программное обеспечение зависит от аппаратной лицензии (USB-ключ), которая устанавливается на компьютер, в противном случае Python не сможет получить доступ к программному обеспечению, и скрипт завершится с кодом выхода 255. Пример кода ниже.

    code-to-activate-licence
except Exception as e:
     warn-user-of-error

Я ожидаю, что блок try-except подберет код завершения и выполнит часть кода except. Тем не менее, я предполагаю, что, поскольку попытка активировать лицензию, по-видимому, не вызывает ошибку, а вместо этого дает ненулевой код завершения, она, похоже, не перехватывается блоком try-except. Есть ли способ перехватить этот код завершения до его фактического выхода из сценария?

1 Ответ

0 голосов
/ 30 апреля 2019

Вы используете except Exception as e:, однако библиотека вызывает sys.exit(), что вызывает SystemExit типа BaseException вместо стандартного Exception. Exception охватывает все несистемные выходы.

Вам нужно явно перехватить SystemExit, чтобы прервать его.

Из [документы] :

исключение SystemExit

Это исключение вызывается функцией sys.exit (). Он наследуется от BaseException вместо Exception, так что он не случайно перехватывается кодом, который перехватывает Exception.

исключение Исключение

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

В коде это будет выглядеть примерно так:

try:
    somecode()
except Exception as e:
    do_something_with_exception(e)
except SystemExit as x:
    do_something_not_exit(x)
...