metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-12-04 03:44 pm

nanomsg, zeromq и ассерты

Продолжаю вникать в легковесные MQ библиотеки и ужасаюсь одной всепроникающей идее - ассерты в релизном коде, буквально на каждый возможный косяк.
С одной стороны, fail-fast это правильный подход, пусть супервизор процессов разбирается что дальше делать.
С другой - abort или RaiseException на виндах кидают messagebox, а messagebox в виндосервисе, если нет чек-бокса "разрешить взаимодействие с десктопом", это гамон, такой процесс можно только убить, он больше не подчиняется указаниям от сервис-контроллера. То же самое - запуск процессов из task scheduler, этот мессаджбокс будет "где-то висеть" в гребенях сессии в которой запущены сервисы.

Далее, нормальная методика при обработке ошибок: try {} catch(exception) { log(сообщение, параметры вызова, exception);throw}. Т.е. я по крайней мере, по логам узнаю, что привело к исключению (за исключением совсем плохих вещей, типа полной нехватки памяти, умершего железа или выдернутого езернет-провода).
В случае же assert - у меня процесс сдыхает (и не дай бог в соседних потоках писать на диск или работать с железом), причем если супервизор, который может прочесть stderr и скопировать сообщение в свой лок,отсутствует - сообщение об ошибке уйдет в никуда.

Судя по тому, как друг на друга псят Martin Sustrik и Pieter Hintjens, отзывам про либы и тому бардаку, который творится в коде nanomsg(например, комментарий вида: /* For some reason simple CancelIo doesn't seem to work here. We have to use CancelIoEx instead. */ в коде, из-за которого nanomsg вообще не запускается на 2003 и xp), ситуация с этими либами откровенно нехорошая.

[identity profile] sbj-ss.livejournal.com 2014-12-04 08:48 pm (UTC)(link)
Простите, а где отмазки-то? И я, и вы говорим, что не надо из сервиса кидать окошки.
Но что касается assert - тут уже разработчики библиотеки упускают из виду, что он может разворачиваться особо умным компилятором в показ MessageBox() (в т.ч. из консольного приложения - встречал) и прочие гадости. Известные ведь грабли, проще написать свой макрос с предсказуемым действием, чем в сотый раз на них наступать.
Если что - я этот сами-знаете-какой-компилятор, разумеется, не оправдываю.

[identity profile] slonopotamus.livejournal.com 2014-12-04 09:16 pm (UTC)(link)
Если уж говорить о компиляторе, то он тут ни при чем. Если почитать мерзкий msdn, то становится понятно, что окошко будет вылезать только если программа слинкована с debug-версией msvcrt. Никто топикстартера не заставлял это делать.

проще написать свой макрос
Проще использовать нормальные операционки, т.к. abort'ом проблемы не ограничиваются, но ребе метакласс известный мазохист и много лет уже сидит под виндой.

[identity profile] sbj-ss.livejournal.com 2014-12-04 09:21 pm (UTC)(link)
Когда линукса на десктопах менее двух процентов - неудивительно. Плюс поддерживать опердень даже под десяток разных дистрибутивов малореально.
Впрочем, это уже холивор.

[identity profile] metaclass.livejournal.com 2014-12-04 10:05 pm (UTC)(link)
В релизе вылазит другое: http://www.cacodaemon.org/nanomsg_exception.png
Оно, впрочем, на любые необработанные исключения вылазит, если SetErrorMode c флагом SEM_NOGPFAULTERRORBOX не вызвать.