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 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:00 pm (UTC)(link)
Не, оно непонятно куда только у совершенно аццких пионеров, которых надо сцаными тряпками гнать из профессии

[identity profile] metaclass.livejournal.com 2012-04-21 09:01 pm (UTC)(link)
Не совсем. Там внутри очень дохуя манипуляции стеками.

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

[identity profile] theiced.livejournal.com 2012-04-21 09:02 pm (UTC)(link)
псевдокод:

foo() {
  throw "и чо";
}

bar() {
  try {
    foo();
  } catch() {
  }

  foo();
}


хуй пойми куда в месте выброса. с готу можно найти сию метку хотя бы.

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

[identity profile] theiced.livejournal.com 2012-04-21 09:04 pm (UTC)(link)
но по итогу это готу в 1313.

[identity profile] justy-tylor.livejournal.com 2012-04-21 09:05 pm (UTC)(link)
Да. Потому что клиентская программа теоретически может это обработать, прибить свои кэши/мусор и повторить попытку вызова мидлвари. Это как уважение к профессионалам, так и защита от обезьян, которые не смогут списать свои ошибки на "'это там в либе упало".

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

[identity profile] metaclass.livejournal.com 2012-04-21 09:06 pm (UTC)(link)
Да не делают так никогда :)
Обычно catch есть ровно в двух местах: конец функции, чтобы в лог отписаться с подробностями, и где-нибудь в корне main или там message loop.
Т.е. постулат: знать, куда ты кидаешь throw, не нужно в принципе, а если хочешь знать - значит ты ебочебурашка и используешь исключения для логики, за что отправляют во тьму внешнюю, где жыды, киркоров и червие.

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

[identity profile] berezovsky.livejournal.com 2012-04-21 09:06 pm (UTC)(link)
1212 же

[identity profile] sbj-ss.livejournal.com 2012-04-21 09:07 pm (UTC)(link)
В случае, про который рассказываю, клиентская программа и мидлварь не разнесены. Встроенный web-cервер. А отправить ошибку клиентскому браузеру я не могу по причинам, указанным выше.

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

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

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

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

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

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

Page 3 of 6