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] vp.livejournal.com 2012-04-21 09:05 pm (UTC)(link)
А ты там еще наставляешь макросов, и оно везде повставляет 100500 раз один и тот же код. Страшно! :)

[identity profile] theiced.livejournal.com 2012-04-21 09:06 pm (UTC)(link)
что в этом страшного?

[identity profile] vp.livejournal.com 2012-04-21 09:09 pm (UTC)(link)
Когда смотреть дебаггером, получается, что писал индус копипастой, причем, АЦЦКОЙ !

[identity profile] metaclass.livejournal.com 2012-04-21 09:18 pm (UTC)(link)
Дебаггером смотреть как раз запрещено :)

[identity profile] vp.livejournal.com 2012-04-21 09:19 pm (UTC)(link)
Дизассемблером, в смысле :)

[identity profile] thedeemon.livejournal.com 2012-04-22 05:31 am (UTC)(link)
Если смотреть дебаггером, в любом коде сплошная копипаста - mov mov mov jnz jnz jnz add add add lea lea lea :)
Надо писать так, чтобы ассемблерные инструкции не повторялись! Don't Repeat Yourself! :)

[identity profile] metaclass.livejournal.com 2012-04-21 09:07 pm (UTC)(link)
Я еще эту некрофилию заменю на кодогенерацию Цэ из Clojure.

[identity profile] theiced.livejournal.com 2012-04-21 09:10 pm (UTC)(link)
вполне разумно. нужно понимать что си - это такой ассемблер потрабельный (более-менее) и использовать его именно как ассемблер.

[identity profile] sbj-ss.livejournal.com 2012-04-21 09:17 pm (UTC)(link)
Вот тут не соглашусь. Ассемблер - инструмент тонкого издевательства над избранной архитектурой, где народ заморачивается не самим решением задачи, а экономией тактов. Тактодрочерство, так сказать. В частности, человека, который множил на 160 командой mul, в своё время закидывали ссаными тряпками.
А Си позволяет сосредоточиться именно на задаче (я не собираюсь его сравнивать в этом плане с языками высокого и сверхвысокого уровня, это C vs asm).
А "портабельный ассемблер" в определённой степени оксюморон :)

[identity profile] theiced.livejournal.com 2012-04-21 09:35 pm (UTC)(link)
ну а как иначе назовёшь. вы не подумайте - я люблю си и его даже умею (ну ладно, умел, дааавно дело было) - вплоть на адового переписывания части кернела для бута на кастомной материнке с покоцанным биосом. но ассемблер он и есть ассемблер. тока портабельный ;]