Как я могу определить, были ли какие-либо ошибки зарегистрированы во время выполнения программы на Python? - PullRequest
2 голосов
/ 07 февраля 2011

У меня есть скрипт на python, который вызывает log.error () и log.exception () в нескольких местах. Эти исключения перехватываются, чтобы скрипт мог продолжать работать, однако я хотел бы иметь возможность определить, были ли когда-либо вызваны log.error () и / или log.exception (), чтобы я мог выйти из скрипта с кодом ошибки вызывая sys.exit (1). Наивная реализация, использующая переменную error, приведена ниже. Мне кажется, должен быть лучший путь.

error = False

try:
  ...
except:
   log.exception("Something bad occurred.")
   error = True

if error:
   sys.exit(1)

Ответы [ 4 ]

2 голосов
/ 01 августа 2017

У меня была та же проблема, что и у исходного постера: я хотел выйти из скрипта Python с кодом ошибки, если были зарегистрированы какие-либо сообщения об ошибках или более серьезной степени тяжести.Для моего приложения желательно, чтобы выполнение продолжалось до тех пор, пока не возникнут необработанные исключения.Тем не менее, если в журнале регистрируются какие-либо ошибки, сборки непрерывных интеграций не будут работать.

Я нашел пакет errorhandler python, который делает то, что нам нужно.См. GitHub , PyPI-страницу и документы .

Ниже приведен код, который я использовал:

import logging
import sys

import errorhandler

# Track if message gets logged with severity of error or greater
error_handler = errorhandler.ErrorHandler()

# Also log to stderr
stream_handler = logging.StreamHandler(stream=sys.stderr)
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # Set whatever logging level for stderr
logger.addHandler(stream_handler)

# Do your program here

if error_handler.fired:
    logger.critical('Failure: exiting with code 1 due to logged errors')
    raise SystemExit(1)
2 голосов
/ 07 февраля 2011

Я думаю, что ваше решение не лучший вариант. Ведение журнала - это один аспект вашего сценария, а возвращение кода ошибки в зависимости от потока управления - это другой. Возможно, лучше использовать исключения.

Но если вы хотите отслеживать звонки в журнале, вы можете заключить их в декоратор. Ниже приведен простой пример декоратора (без наследования или доступа к динамическим атрибутам):

class LogWrapper:

    def __init__(self, log):
        self.log = log
        self.error = False

    def exception(self, message)
        self.error = True
        self.log.exception(message)
0 голосов
/ 12 декабря 2018

Вы можете проверить logger._cache. Он возвращает словарь с ключами, соответствующими числовому значению зарегистрированного уровня ошибок. Так что для проверки, если ошибка была зарегистрирована, вы можете сделать:

if 40 in logger._cache and logger._cache[40]

0 голосов
/ 08 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...