Есть ли шаблон для распространения информации об ошибках и предупреждениях? - PullRequest
6 голосов
/ 23 февраля 2009

Существует ли распространенный шаблон для распространения сведений об ошибках и предупреждениях? Под error я подразумеваю серьезные проблемы, которые должны привести к остановке потока кода. Под предупреждениями я имею в виду проблемы, которые заслуживают информирования пользователя о проблеме, но слишком тривиальны, чтобы остановить выполнение программы.

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

>>> import logging
>>>
>>> def process_item(item):
...     if item:
...         if item == 'broken':
...             logging.warning('soft error, continue with next item')

...     else:
...         raise Exception('hard error, cannot continue')
...
>>> process_item('good')
>>> process_item(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in process_item
Exception: hard error, cannot continue
>>> process_item('broken')
WARNING:root:soft error, continue with next item

Этот пример (и моя текущая проблема) написан на Python, но он должен применяться и к другим языкам с исключениями.


После предложения Дэвида и краткой игры с приведенным ниже примером, модуль Python warnings - это путь.

import warnings

class MyWarning(Warning):
    pass

def causes_warnings():
    print 'enter causes_warnings'
    warnings.warn("my warning", MyWarning)
    print 'leave causes_warnings'

def do_stuff():
    print 'enter do_stuff'
    causes_warnings()
    causes_warnings()
    causes_warnings()
    print 'leave do_stuff'

with warnings.catch_warnings(record=True) as w:
    # Cause all warnings to always be triggered.
    warnings.simplefilter("always")
    # Trigger a number of warnings.
    do_stuff()
    # Do something (not very) useful with the warnings generated
    print 'Warnings:',','.join([str(warning.message) for warning in w])

Выход:

enter do_stuff
enter causes_warnings
leave causes_warnings
enter causes_warnings
leave causes_warnings
enter causes_warnings
leave causes_warnings
leave do_stuff
Warnings: my warning,my warning,my warning

Примечание: Python 2.6+ требуется для catch_warnings.

Ответы [ 2 ]

7 голосов
/ 23 февраля 2009

Посмотрите на модуль Python warnings, http://docs.python.org/library/warnings.html

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

0 голосов
/ 23 февраля 2009

Должны всплыть серьезные ошибки, просто нужно зарегистрировать предупреждение, не выдавая исключений.

...