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).

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


Ответ на: Re: Обработка ошибок в C. от cvv

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

Из описания 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 ()

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

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

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

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

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

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

anonymous ()
Ответ на: Re: Обработка ошибок в C. от anonymous

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

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

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

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