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:51 pm (UTC)(link)
А как быть с тем, что использование goto - это последние 20 лет является безоговорочным поводом для ИТ-убийства канделябром? :)

[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)
И я бы целый день не мокал линуксоидов в попирание РФЦ? Да ну нафиг :)

(no subject)

[identity profile] theiced.livejournal.com - 2012-04-21 21:13 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-04-21 21:18 (UTC) - Expand

[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)
Когда смотреть дебаггером, получается, что писал индус копипастой, причем, АЦЦКОЙ !

(no subject)

[identity profile] metaclass.livejournal.com - 2012-04-21 21:18 (UTC) - Expand

(no subject)

[identity profile] vp.livejournal.com - 2012-04-21 21:19 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-04-22 05:31 (UTC) - Expand

[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)
вполне разумно. нужно понимать что си - это такой ассемблер потрабельный (более-менее) и использовать его именно как ассемблер.

(no subject)

[identity profile] sbj-ss.livejournal.com - 2012-04-21 21:17 (UTC) - Expand

(no subject)

[identity profile] theiced.livejournal.com - 2012-04-21 21:35 (UTC) - Expand

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

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

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

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

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

[identity profile] theiced.livejournal.com 2012-04-21 09:08 pm (UTC)(link)
да. старость, склероз.