LINUX.ORG.RU

[C] [жизнь без исключений] Как вы обрабатываете ошибки?

 


0

0

Пишу на C прошивку для микроконтроллера. Возникла следующая проблема:

while (1) {
	..
	for (..) {
		..
		if (..) {
			вдруг неожиданно произошло что-то очень не хорошее, например, аппаратная ошибка несовместимая с нормальной работой программы, нужно выйти из цикла while (1)
		}
		..
	}
	..
	switch (..) {
	case ..:
		if (..) такая же ситуация...
		break;
		..
	}
	..
}
.. 
if (флаг если ошибка) {
	обработка
}
..

И как тут быть? Неужели goto, и будет мне вагон счастья? А как же «напишешь «goto» и за тобой придёт бабай! Буууу!» (c), Дейкстра и весь такой прочий антураж?


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

Неправильно.

Правильно так:

if (func1())
    обработка1;

if (func2()) {
    обработка2;
    обработка1;
}

if (func3()) {
    обработка3;
    обработка2;
    обработка1;
}

if (func4()) {
    обработка4;
    обработка3;
    обработка2;
    обработка1;
}

против:

if (func1())
    goto err_func1;
if (func2())
    goto err_func2;
if (func3())
    goto err_func3;
if (func4())
    goto err_func4;

return ok;

err_func4:
    обработка4;
err_func3:
    обработка3;
err_func2:
    обработка2;
err_func1:
    обработка1;
    
return err;

Так где жопа?

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

>Так где жопа?
плюсую твой пример! в ядре такое очень часто встречается.

xydo ★★
()
Ответ на: комментарий от golodranez

>Как уже написал Reset обработки в основном однотипны, а у тебя хрень какаято:)
нихрена они не однотипны.

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