LINUX.ORG.RU

Обработка ошибок в C.


0

0

Доброе время суток!

В ходе разработки некоторой библиотеки возник вопрос каким образом нужно обрабатывать ошибки времени исполнения. Как я понимаю, все ошибки данного типа можно разделить на 2 больших группы:
1. ошибки, возникающие по не зависящим от программы обстоятельствам;
2. ошибки, являющиеся следствием некорректной работы самой программы.

С первой группой ошибок все понятно : функция, в которой возможно возникновение такой ошибки, сообщает о результате операции с помошью возвращаемого значения.

Со второй группой ошибок все намного сложнее и вопрос связан именно с ней. Ошибки этой группы связаны с некорректностью переданных функции аргументов (например, вместо указателя на строку передается NULL). Внимание вопрос: что делать в случае возникновения такой ошибки? Вот какие варианты я нашел в реальных библиотеках:

1. Входные параметры не контролируются. Программа сама завершиться по причине Segmentation Failed (ex.: memcpy() в glibc).

2. Функция, обнаружившая некорректность входных аргументов, выводит в журнал сообщение об ошибки и завершает исполнение программы. (ex.: g_error() в glib).

3. Промежуточный вариант: если функция обнаружила некорректность переданных аргументов, то она не выполняет никаких действий, а выполняет return. Также может происходить запись в журнал (stderror). (ex.: linux kernel).

На чём остановиться, господа?


Ответ на: комментарий от cvv

Из описания glib API:

"First and foremost: GError should only be used to report recoverable runtime errors, never to report programming errors."

Я же говорил как раз про другую группу ошибок - ошибок, связанных с неправильной работой самой программы. В этом случае, glib Reference Manual рекомендуется использовать g_warning и g_error, однако g_error, к примеру, приведет к аварийному завершению программы, что, как мне кажется, не совсем правильная модель поведения для библиотеки.

syomin
() автор топика

Тут все зависит от степени желаемой "крутости". Конечно, проверять правильность процесса выполнения нужно. На эту тему статей очень много написано, начиная с Дейкстры и Кнута. Проверка там предусловий и постусловий.

Обычно для этого достаточно assert'ов из glibc или каких-то более удобных замен из используемых библиотек, например g_return_val_if_fail из glib.

Если же требования к программе более серьезные или желания более амбициозные, то можно взять более серьезную библиотеку и использовать unit-тесты и все такое. Есть, например, "сенсоры" и "актуаторы". Тут тоже много литературы. Вот, например, первая ссылка из google на Software Testing

http://www.aptest.com/resources.html

Для начала нужно знать, для чего пишется программа и сколько на нее сил можно потратить.

anonymous
()
Ответ на: комментарий от anonymous

В общем, я остановился на варианте, аналогичном g_return _if_fail, т.е. функция, обнаружившая некорректные аргументы, выдает предупредительное сообщение и выполняет return. В случае, если есть возможность сообщить вызвавшему коду о произошедшей ошибке через код возврата, это делается.

P.S. За ссылку спасибо - на досуге почитаю.

syomin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.