Хорошие практики для уровневой отладки и обработки ошибок - PullRequest
0 голосов
/ 19 апреля 2011

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

enum error_level
{
    el_neglegable = 0,
    el_notable_to_log = 10,
    el_notable_to_print = 100,
    el_terminate_program = 1000,
    /* you can fragment the levels even more, of course */
};

void inline process_error( error_level error )
{
    if( error >= el_notable_to_print ) printf("A notable error has occured!\n");
    if( error >= el_terminate_program ) exit();
    /* you can build in more queries like this, of course */
}

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

Вопрос: Знаете ли вы хорошие рекомендации, практики ии тому подобное, чтобы получить код, который более удобен в обслуживании и учитывает такую ​​модель отладки?

1 Ответ

1 голос
/ 21 апреля 2011

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

Моя причина сказать, что метод, который сталкивается с ошибкой, не имеет контекста.

Рассмотрим ситуацию, когда не удается открыть соединение через сокет. Какую серьезность ошибки вы бы хотели вернуть socket.open (хост, порт)? В зависимости от контекста вы можете:

  • Тихая попытка
  • Регистрация и повтор
  • Бросить диалог до пользователя
  • Попробуйте другое соединение в списке
  • Завершить программу
  • и т.д.

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

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

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

В этом случае socket.open(host,port) приведет к ошибке, подобной socket_open_fails, и у вызывающей стороны будет контекст, который будет знать, что делать в случае сбоя при открытии сокета. Он будет знать, используется ли сокет для получения жизненно важных данных, без которых программа не может продолжить работу, или является более необязательным (возможно, для получения обновлений программы).

Итак: не определяйте свои условия ошибки по действию, которое нужно предпринять: определяйте их по тому, что не удалось.


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

...