Re[20]: Тенденции языков
От: jazzer Россия Skype: enerjazzer
Дата: 22.05.15 09:38
Оценка: +2
Здравствуйте, hi_octane, Вы писали:

_>Сам на С++ пишу редко (но раньше, до стандарта 11, писал много), так что если в каких-то пунктах ошибаюсь или отстал от жизни то поправьте плиз.


_>То что не нравилось мне:


_>1) нет finally, поэтому основная идиома "прибрать за собой в любом случае, было исключение или нет", превращается либо в двойные телодвижения, либо в надежду на RAII. Про макросы и библиотеки эмулирующие finally я вкурсе, не устраивают.


Что значит "надежда на RAII"? Это все равно что "надежда на то, что sin(x) вернет синус, а не косинус"
RAII — это же не финализаторы в управляемых языках, которые хз когда позовутся и позовутся ли вообще.
Тут все гарантировано самим языком, безо всяких надежд.

_>2) можно кидать и ловить любую ерунду, с которой потом фиг поймёшь что делать. Вместе с другими зажравшимися программистами из мира интерпретаторов я уже привык к удобному объекту "исключение", с полями, методами, вот этим всем.


Все вменяемые разработчики бросают производные от std::exception аж с 98 года.

_>3) разные команды используют разные базовые классы для исключений, и ни в стандарте ни в популярных либах нету самого главного — стэк трэйса. В результате на разных платформах и в разных компиляторах нужен разный код для сбора стэктрэйса, котрый вроде как нужно вызывать именно в методе где летело само исключение, потом уже поздно. На MSVC точно было именно так, на GCC чуть легче, на Intel не помню.


В-нулевых, про разные команды см. выше.
Во-первых, с возвращаемыми значениями стек-трейса уж точно не будет. Если с исключениями можно по крайней мере запустить под дебагером и она тормознет программу в момент генерации исключения, то возвращаемые значения и этого не дадут.
Во-вторых, "вызывать именно в методе, где летело" означает "вызывать в конструкторе исключения" — именно так все и делают (несколько тем на RSDN было об этом) и никакого лишнего кода в "методе, где летело", не появляется — все спрятано в конструкторе.
Плюс есть Boost.Exception, который позволяет кучу функциональности сверху навесить.

_>4) как следствие 3 большинство глобальных перехватов исключений сводится к "записать memory dump при вылете". В том же C# до мемори дампа дело доходит гораздо реже чем в C++.


Я у себя такого большинства не наблюдаю. Очень мало когда дело доходит именно до глобальных обработчиков, и даже если доходит, то в самом объекте исключения вся информация уже будет.

_>5) возникают сложные моменты если исключения летят в конструкторах/деструкторах. Для собеседований оно даже хорошо, для надёжной работы не очень.


То ли дело возвращаемые значения. Так и вижу, как из конструктора/деструктора возвращаются коды ошибок
Как раз исключения в конструкторах гарантируют, что объект не будет создан в кривом состоянии.
При этом RAII прибьет то, что успело создаться к моменту вылета исключения.

_>6) хотелось бы больше помощи от компилятора/IDE в деле разбора чего как и откуда в принципе может вылететь. Этого хотелось бы от всех компиляторов, но C++ в этом чуть впереди, так как появился noexcept.


да, noexcept рулит. Раньше приходилось либо атрибутами пользоваться, либо вообще комментариями (что, в принципе, как-то работало — у меня был специальный doxygen-макрос на эту тему)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.