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] metaclass.livejournal.com 2012-04-21 08:52 pm (UTC)(link)
В Цэ goto для обработки ошибок разрешается :)

[identity profile] vp.livejournal.com 2012-04-21 08:57 pm (UTC)(link)
Да, и иногда можно в одном коде писать CR во второй половине файла, когда в первой идет все с CRLF. Мы уже в курсе :)
Один раз не пидорас.

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

[identity profile] vp.livejournal.com 2012-04-21 09:01 pm (UTC)(link)
Багзилла тоже запрещена. Только плейнтекст! Только хардкор! :)

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

[identity profile] vp.livejournal.com 2012-04-21 09:11 pm (UTC)(link)
И я бы целый день не мокал линуксоидов в попирание РФЦ? Да ну нафиг :)

[identity profile] theiced.livejournal.com 2012-04-21 09:13 pm (UTC)(link)
ну никто не спорит что в этом есть и плюсы. я буду повторяться но:

1. торвальдс и ко - долбоёбы и кретины.
2. линуксы - это не только бабуиниан и красношапки - есть адекватные дистры и адекватные люди.

[identity profile] vp.livejournal.com 2012-04-21 09:18 pm (UTC)(link)
Ребе, я в курсе. Но спасибо ребе метаклассу, я получил с того поста, наверное, удовольствие за год :)

[identity profile] dair-spb.livejournal.com 2012-04-22 08:55 am (UTC)(link)
Я чувствую личное ;-)

[identity profile] metaclass.livejournal.com 2012-04-22 09:08 am (UTC)(link)
Я на работе жэстачайшым образом насаждаю процессы, баг-трекеры, меркуриалы и прочий ад заборов и коровников :)

[identity profile] max630.livejournal.com 2012-04-22 04:14 am (UTC)(link)
пиздеть не надо, в дебиан патчи аттачментами принимаются

[identity profile] metaclass.livejournal.com 2012-04-21 09:02 pm (UTC)(link)
Ой, я тут напрограммился на С уже. 100 строк прототип проги, а задолбался, как не в себя. Хелпов контекстных нет, копи-пейст см. ниже по ЖЖ, интеллисенса нет, переменные только в начале функции, мейкфайлы анальны, итд

[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)
ну а как иначе назовёшь. вы не подумайте - я люблю си и его даже умею (ну ладно, умел, дааавно дело было) - вплоть на адового переписывания части кернела для бута на кастомной материнке с покоцанным биосом. но ассемблер он и есть ассемблер. тока портабельный ;]