LINUX.ORG.RU

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

 


0

0

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

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

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


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

Это ты к чему сказал? Точно такая же техника что тут и обсуждалась, что тут непонятного?


if(!SocketConnectionable(hw,params->smtp)) {
    goto SOCK_ERR;
}

ProgressUpdate("Вход",0);
if(!SMTPOpen(params->smtp)) {
    goto SMTP_ERR;
}

ProgressUpdate("Отправление письма на %s",dbi->to);
if(!SMTPHelo("FastMail")) {
    goto SMTP_HELLO_ERR;
}

if(!SMTPFrom(dbi->from)) {
    goto SMTP_FROM_ERR;
}

...

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

>На мой взгляд в стиле с return читаемость намного лучше, не нужно бугать по коду глазами

>в случае с исключениями запись логична, и глаза по коду не разбегаються:)

одному мне кажется, что тут где то взаимоисключающие параграфы?

>Это колбаса - следствие неправильно спроектированной функции, не моей. Ещё раз говорю(уже двадцатый) - заранее чётко продумывайте структуру приложения и goto вам не понадобится.

ну так вы видите функцию, видите что она делает, спроэктируйте правильно и докажите нам это, а так - это пустые слова

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

> ну так то для памяти только

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

> в С тоже можно alloca использовать

Нельзя. Непереносимо, с бага^W "особенностями" реализации почти везде и тыды. В общем, неполноценная замена. Хотя удобно порой, да.

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

> Это ты к чему сказал? Точно такая же техника что тут и обсуждалась, что тут непонятного?

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

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

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

есть объект, у него метод - откатить изменения, в деструкторе ес-но он не вызывается, как тут помогут умные указатели?

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

> В C++ для чего угодно. Можно всё что угодно в классы завернуть.

вы серьезно считаете, что для вызова одного метода лучше написать еще один класс и использовать smart_ptr? и поступать так каждый раз?

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

Что значит левый? Он абсолютно повторяет функционал того что написано. Не нравится goto закинь эксепшены (я не знаю как они в плюсах делаются).

Это стандартный паттерн написания сетевых приложений, nginx написан местами аналогично.

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

> Не нравится goto закинь эксепшены (я не знаю как они в плюсах делаются).

вариант с goto уже обсудили, ты же написал про эксепшены, и я спросил как ты хочешь решить именно ими

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

> есть объект, у него метод - откатить изменения, в деструкторе ес-но он не вызывается, как тут помогут умные указатели?

Я ж не говорю, что простым наворачиванием smart_ptr<> вокруг произвольного класса мы автомагически получаем автомагическое освобождение всех ресурсов, когда надо. 8)) Но это можно сделать, либо изменив класс, либо сообразив что-то подобное умным указателям, но со своими, свойственными данной задаче, особенностями.

Не всегда, конечно, но, пожалуй что, в подавляющем большинстве случаев.

PS: хоть я и терпеть не могу плюсовку. 8))

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

> Можно всё что угодно в классы завернуть.

и получится жаба.

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

Да тут разговор вообще не об этом. Человек спросил чем плох представленный код, я ответил. А ты опять поднял сей эпический тред goto vs эксепшены.

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

>есть объект, у него метод - откатить изменения, в деструкторе ес-но он >не вызывается, как тут помогут умные указатели?

К boost::smart_ptr можно свой deleter прикрутить и в нём чистить ресурсы.

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

> Этот кусок не надо было реализовать не вложенными if-ами а эксепшенами
> Да тут разговор вообще не об этом. Человек спросил чем плох представленный код, я ответил.


учись тогда писать, что думаешь - а не "надо было реализовать эксепшенами", а потом отмазываться, что "разговор вообще не об этом"

П.С. все

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

> Троль необразованный, читай это до просветления:

> Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

> * последовательное исполнение — [...[; * ветвление — [...]; * цикл - [...]

Самоучка детектед. Любая программа _может_ быть представлена в виде этих базовых конструкций. А ламеры типа тебя с чего-то решили, что программа _должна_ быть представлена в виде этих конструкций. Классическая "смерть от опечатки" (с)

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

> * цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла)

Деточко, break/continue уже нарушают эту религию. А ну быстро пошёл переписывать всё лестницами if'ов, и чтобы ни одного break/continue!

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

> в результате получим кучу мелких функций на одну строку

Судя про 'auto ptr = ...' это C++xХЗ_когда, там лямбды есть. 8))

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

> в результате получим кучу мелких функций на одну строку

Ну это я в ответ на ... , написал .
Конечно в плюсах "правильнее" управлять ресурсами с RAII

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

>Судя про 'auto ptr = ...' это C++xХЗ_когда, там лямбды есть. 8))

Мне просто не хотелось BOOST_AUTO писать, но я уже пожалел об этом :-)

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

>> это C++xХЗ_когда

> это g++ 4.4 :)

А при чём тут gcc? Там это появилось как реализация частей черновика будущего страш^W стандарта.

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

> Мне просто не хотелось BOOST_AUTO писать, но я уже пожалел об этом :-)

В бусте, не к ночи будь помянут, тоже есть реализация лямбд (не к ночи будет помянута) 8))

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

> А при чём тут gcc? Там это появилось как реализация частей черновика будущего страш^W стандарта.

просто указал, что при желании можно уже пользоваться готовой реализацией

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

>Непереносимо, с бага^W "особенностями" реализации почти везде и тыды. В общем, неполноценная замена.

А есть, кстати, архитектуры где alloca нет и нельзя сделать?

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

> А есть, кстати, архитектуры где alloca нет

Не помню. Вроде бы что-то странное встречалось, но не уверен.

> и нельзя сделать?

Это вряд ли. Тем или иным способом сделать всегда можно. 8))

Проблема непереносимости в другом -- неопределённое поведение, если требуемый размер не влезает в стек.

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

> boost.bind и boot.lambda вам помогут.

Это такой перл для с++. В смысле, легким движением руки код превращается в спагетти под соусом. 8))

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

>ну так то для памяти только, в С тоже можно alloca использовать

This function is not in POSIX.1-2001. В Linux можно, да... Но не им единым...

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

>Это такой перл для с++. В смысле, легким движением руки код превращается в спагетти под соусом. 8))

Речь шла о самой возможности обойтись без мелких функций-deleter'ов в C++.

Понятно, что если есть возможность обойтись без C++ вообще -- её надо использовать)

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

>Это вряд ли. Тем или иным способом сделать всегда можно. 8))

В байткоде жабы стек вызовов насколько я понимаю недоступен?

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

>читабельность _много_ лучше, чем примерно такого же виде конструкция с goto. имхо он бредит.

Вот когда будете участвовать в больших проетках, тогда расскажите)

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

Товарищь дятел, ты все свои мозги выстучал уже видать. Элементарного русского языка не понимаешь.

КОД ВЫПОЛНЯЕТСЯ В ТОМ ПОРЯДКЕ В КАКОМ ОН НАПИСАН.

Развелось блин быдлокодеров.

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

>Вот когда будете участвовать в больших проетках, тогда расскажите)

а в каких известных больших проектах участвовали вы?

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

пустые слова это давать функцию на 3 строчки и чтото для неё делать.

я уже всё объяснил, умеющие читать всё увидели и как правильно должна быть организованна работа программы поняли.

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

> Товарищь дятел, ты все свои мозги выстучал уже видать.

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

> КОД ВЫПОЛНЯЕТСЯ В ТОМ ПОРЯДКЕ В КАКОМ ОН НАПИСАН.

Это ты претендуешь на премию Тьюринга?

> Развелось блин быдлокодеров.

Развелось недоучек, которые считают себя очень знающими.

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

>break/continue уже нарушают

break и continue завершают всегда логические блоки, в отличии от goto. Дети, вы задолбали уже фигню писать.

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

Ребёнок, когда, наконец-таки, научишься читать -- сходи в библиотеку и возьми умных книжек. Устал уже дошколятам объяснять.

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

>слив засчитывать?

Ты мне предлагаешь тут всем по 10 раз объяснять очевидные вещи? я уже все написал, причём неоднократно.

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

>Ребёнок, когда, наконец-таки, научишься читать -- сходи в библиотеку и возьми умных книжек. Устал уже дошколятам объяснять.

Блин, сколько троллей малограмотных на лоре стало...

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

>Ты мне предлагаешь тут всем по 10 раз объяснять очевидные вещи? я уже все написал, причём неоднократно.

объясни хотя бы один раз

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

> Блин, сколько троллей малограмотных на лоре стало...

И не говори. Убей себя, сделай мир на одного малограмотного тролля чище.

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

Неуч, сходи в школу всётаки:) И никогда больше не берись за программирование.

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