Товарищи, кто как в си обрабатывает ошибки и проверяет их в коде?
Может есть на этот счёт шикарные книги, стандарты или видео или может ключевые слова какие то для поиска в интернете?
Если подробнее, в чем вой вопрос
Я вижу две разные темы
1) Что вы вообще проверяете в коде?
Напрмер, проверяете ли вы в каждой функции каждый входящий параметр на корректность, или в функциях вы вообще ничего не проверяете, а проверяете только входящие в программу параметры извне - ввод пользователя и пакеты пришедшие по каналам связи. Таким образом доверяете себе полностью, исключая из программы элемент выявления ошибок - в данном случае я вижу большую проблему в крупных проектах, где потом хрен найдешь ошибку.
2) Как вы обрабатывает ошибку, если выявили ее?
Я в разных проектах видел много подходов
2.1) Стараться обрабатывать каждую ошибку и исправлять ее, делать анализ и если не возможно продолжить работу, выдавать подробную причину ошибки пользователю или в лог, но всеми силами стараться сохранить работоспособность программы, не выключая ее - поднимаясь по стеклу вверх до работающей части.
Этот вариант прямо скажем нереален для всех видов ошибок и безумно громоздок в плане описания в коде, плюс слишком много времени тратится на процессинг ошибок, вместо написания главной логики.
2.2) Просто в самом месте где обнаружена ошибка писать ошибку в лог и перезагружать или завершать программу, даже не поднимая ошибку выше по стеклу, и если ошибка была в функции, то не возвращая код ошибки выше, тому кто ее вызвал. Данный вариант шикарен тем, что занимает минимум места и вообще не заграмождает код - в мейне по сути только главная логика приложения, без длинного процессинга ошибок.
2.3) Вариант чуть загроможденнее предыдущего. Писать все функции так, чтобы возвращаемое значение в случае корректного процессинга функцией было 0 и далее возвращать код ошибки из функции выше. Например в мейн и там одной строкой макроса проверять на ноль значение и если оно не ноль, так же завершать программу и записывать лог.
ret_code = func();
CHECK_FOR_NULL(ret_code);
2.4) Делать короткий процессинг прямо с возвращаемым значением путем написания к каждому вызову функции, например в стандарте мисра написано, что любой if должен быть с else, поэтому пишем два условия
ret_code = func();
if(ret_code == 0)
{
/* Do nothing */
}
else
{
/* Short error processing*/
}