metaclass: (Default)
[personal profile] metaclass
Это, а как в 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.

Date: 2012-04-21 08:32 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Строки под ошибки рекомендуют выделять заранее:)

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

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

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

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

Date: 2012-04-21 09:22 pm (UTC)
From: [identity profile] justy-tylor.livejournal.com
Я на "всё пропало" отдельный буфер делал. Но это на мобилках. Где и как работают сокеты при кончившейся памяти - таким вопросом не задавался.

Date: 2012-04-21 09:36 pm (UTC)
From: [identity profile] sbj-ss.livejournal.com
Если честно, я предпочитаю в принципе не заморачиваться подобного рода вопросами. Если человек хочет построить национальную библиотеку с помощью напильника и лопаты, флаг ему в руки. И пусть не обижается, что заработал грыжу. Соответственно если клиент заявляет, что ему RSS парсить, а потом на P3/256Mb DOM-парсером пытается колбасить гигабайты XML, это не моя проблема.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 30th, 2025 03:31 pm
Powered by Dreamwidth Studios