Запрет трассировки в основном

В моем main.py модуль, я вызываю функцию myFunc() от util.py, В util.pyЯ обращаюсь с исключением, что myFunc() может бросить и позвонить sys.exit(1), Тем не менее, я все еще получаю печать трассировки в моем main.py модуль. Есть ли способ просто поймать исключение в util и не приходится иметь дело с каким-либо выводом в mainили для меня лучше поймать исключение в main а не в util?

def get_token(token_name):

    token_handler = Tokens(token_name)
    try:
        token = token_handler.get()
    except TokenException  as e:
        logging.error("{error}".format(error=e))
        sys.exit(1)

    return token

1 ответ

Решение

Это вопрос принципа проектирования, но общая идея - ловить исключения только тогда, когда вы знаете, что с ними делать.

Глотать исключения не очень хорошая идея, потому что это делает отладку намного сложнее. Особенно, когда у вас есть критический код, написанный таким образом, с несколькими точками вызова. Исключения, сгенерированные внутри функции, должны быть переброшены / повторно вызваны для обработки кодом, вызвавшим эту функцию.

Например, вы можете рассмотреть возможность изменения utils.py как это:

def get_token(token_name):
    token_handler = Tokens(token_name)
    try:
        token = token_handler.get()
    except TokenException  as e:
        # write to some log file if needed
        raise e

    return token

Точно так же ваш main.py будет выглядеть примерно так:

try:
    token = get_token(token_name)
except TokenException:
    ... # handle TokenException
except Exception:
    ... # handle any other Exception

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

Другие вопросы по тегам