metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-04-21 09:12 pm

Чистый C, обработка ошибок

Это, а как в C принято обрабатывать ошибки?
Т.е. обычная программа: я открываю всякие ком-порты, сокеты и файлы, что-то с ними пытаюсь делать, затем закрываю. В дельфи/java/C#/Clojure это всегда делается через обработку исключений в виде try-finally/using или чего-то аналогичного, в C++ - RAII, а вот что делать в С? Аналогично, с выводом сообщений об ошибке - try{..}catch(Exception e) {logger.Fatal(e};raise}

Я каждую вызываемую функцию проверяю на адекватность возвращаемого результата и при ошибке вывожу в stderr сообщение и strerror(errno), причем выглядит это достаточно единообразно, чтобы хотелось автоматизировать, но принято ли делать хитрожопые макросы типа CHECKERROR(some_call(),"some_call failed") и из них вываливаться из программы при ошибках?

А, и это - принято ли в C заниматься конкатенацией строк по поводу и без повода? А то, скажем, я привык в простых программах особо не мудрить и при необходимости складывать строки, если нет явных требований к производительности. Например, какая-нибудь дурь типа генерации строковых команд из шаблонов и параметров - тупо поскладывал строки и вернул результат. А в С придется strcat использовать, буфера какие-то объявлять, память выделять, трястись за ее удаление или же писать результат прямо в выходной файл, что вообще tight coupling.

[identity profile] blackyblack.livejournal.com 2012-04-21 08:35 pm (UTC)(link)
Это не решение, а заголовочный файл.

[identity profile] theiced.livejournal.com 2012-04-21 08:35 pm (UTC)(link)
где трындец? нормальный код. только надо забыть бред всунутый в моск долбоёбами про то что "goto плохо".

[identity profile] swizard.livejournal.com 2012-04-21 08:36 pm (UTC)(link)
Ну чёрт его знает, в freebsd-шном мануале она есть

[identity profile] permea-kra.livejournal.com 2012-04-21 08:39 pm (UTC)(link)
>А, и это - принято ли в C заниматься конкатенацией строк по поводу и без повода?
Емнип, там трясуться за производительность, поэтому в линупсах даже придумали writev. Вот куда он потом дополз - вопрос более интересный.

[identity profile] blackyblack.livejournal.com 2012-04-21 08:39 pm (UTC)(link)
Я, всё-таки, предпочитаю не использовать гото, а делать так:

while(1)
{
if (!cond)
break;

//success
break;
}

//finalizer

[identity profile] sbj-ss.livejournal.com 2012-04-21 08:39 pm (UTC)(link)
А stage при этом присваивается 47? :)
Иногда ж ресурсы приходится освобождать в порядке, обратном выделению.

[identity profile] sbj-ss.livejournal.com 2012-04-21 08:40 pm (UTC)(link)
С "goto плохо" - в жопие, где говно, с места, это понятно :)

[identity profile] sbj-ss.livejournal.com 2012-04-21 08:41 pm (UTC)(link)
Это демонстрация, как можно сделать. Сишный файл отдал бы, не жалко, да проект коммерческий :(

[identity profile] metaclass.livejournal.com 2012-04-21 08:41 pm (UTC)(link)
>Все буфера выделяются статически или в стеке
Если проверять при этом размеры, то наверно, ничего страшного. Надо себе сломать мозг и делать универсально только там где это действительно нужно, типа "а тут нашей проге через stdin дадут 2гб строку из 20 гб файла"

[identity profile] sbj-ss.livejournal.com 2012-04-21 08:43 pm (UTC)(link)
Ребе, больное место. Думал и о таком. Но опять же, если памяти катастрофически нет, а в многострадальный псевдостатический буфер сообщений об ошибках уже "не лызе" - мне его грохнуть и заменить глобальной ошибкой "нет памяти вообще ни под что"? :\

[identity profile] metaclass.livejournal.com 2012-04-21 08:44 pm (UTC)(link)
scatter-gather. какой гамон.

[identity profile] metaclass.livejournal.com 2012-04-21 08:45 pm (UTC)(link)
А, лишний уровень вложенности и код, наверно гото проще для восприятия будет.

[identity profile] sbj-ss.livejournal.com 2012-04-21 08:45 pm (UTC)(link)
Syntactic sugar. Результирующий машинный код, сдаётся мне, будет идентичен.

[identity profile] metaclass.livejournal.com 2012-04-21 08:46 pm (UTC)(link)
"goto v_jopy_s_govnom;"

[identity profile] vp.livejournal.com 2012-04-21 08:48 pm (UTC)(link)
FreeAndNil, да :)

[identity profile] theiced.livejournal.com 2012-04-21 08:48 pm (UTC)(link)
krome corpse

[identity profile] theiced.livejournal.com 2012-04-21 08:49 pm (UTC)(link)
не ну понятно что бензопилой можно себе хуй отпилить. бензопила то не виновата :]

[identity profile] metaclass.livejournal.com 2012-04-21 08:49 pm (UTC)(link)
Впрочем, для окончательной смерти достаточно наверно вообще статических строк вида " we are cluster-fucked beyond any comprehension (__FILE__ __LINE__)".

[identity profile] vp.livejournal.com 2012-04-21 08:51 pm (UTC)(link)
А как быть с тем, что использование goto - это последние 20 лет является безоговорочным поводом для ИТ-убийства канделябром? :)

[identity profile] metaclass.livejournal.com 2012-04-21 08:52 pm (UTC)(link)
В Цэ goto для обработки ошибок разрешается :)

[identity profile] theiced.livejournal.com 2012-04-21 08:54 pm (UTC)(link)
ребе, только среди идиотов которые не умеют думать вообще. их потолок - говносайтики на аспнет и они нам не интересны :]

[identity profile] plumqqz.livejournal.com 2012-04-21 08:55 pm (UTC)(link)
В дельфи/java/C#/Clojure это всегда делается через обработку исключений в виде try-finally/using или чего-то аналогичного, в C++ - RAII, а вот что делать в С?

Ну и тут делайте. setjmp/longjmp

[identity profile] theiced.livejournal.com 2012-04-21 08:55 pm (UTC)(link)
ну и вы же понимаете что ваши любимые эксепшны это на самом деле "готу хуй пойми куда".

[identity profile] berezovsky.livejournal.com 2012-04-21 08:57 pm (UTC)(link)
внезапно си

Page 2 of 6