LINUX.ORG.RU

exceptions в C++

 ,


5

9

В свое время давным-давно до меня доносился звон что эксепшены в плюсах реализованы через жопу, и что в отличие от какой-нибудь там джавы, где обработка исключительных ситуаций с помощью эксепшенов - это нормально и хорошо, в плюсах ими лучше лишний раз не пользоваться. Что, мол, организация стека в сях какая-то не такая, и что компиляторы костыли специальные городят чтобы корректно поднимать исключение наверх по вызовам, и всякое такое.

Кто-нибудь может накидать каких-нибудь технических статей на тему как следует или не следует применять эксепшены в плюсах?

UPD:
Из любопытного
почитать (стр. 32)
посмотреть

★★★★★

Последнее исправление: morse (всего исправлений: 1)

скорей всего все дело в возне с ресурсами (жицы) и неопределенностью (различием) поведения в некоторых ситуациях (отсутствие раскрутки стека в жиции) при броске ексепшена, приводящих к утечкам памяти либо диким воркераундам и нелепым ограничениям стиля и логики с целью их избежать. так-же дела плохи в некоторых платформах, не знаю точно почему (вылетело из головы) но кажись на каких-то ембедах ексепшены вообще не используются, потому всеядные тулкиты, вроде куть, используют RV для индикации ошибок. в остальном нелюбовь к исключениям связана с неосилившими пердунами, ее пропагандирующими.

anonymous
()
Ответ на: комментарий от Davidov

тут следует уточнить, оп спрашивает в контексте ИСКЛЮЧИТ ЕЛЬНЫХ СИТУАЦИЙ (ЕКСЦЕПшН) или в контексте raise Return(value) синтаксиса (как например в 3-й торнадо напистоне в генераторах)

anonymous
()
Ответ на: комментарий от anonymous

или throw, что там в крестиках

anonymous
()

Было отличнейшее видео на эту тему, если мне память не изменяет, с конференции по С++ в Новосибирске в 2015 году, но найти не могу. Там товарищ ЕМНИП из Яндекса рассказывает про Chromium, как они живут без них и почему решили отказаться.

CrossFire ★★★★★
()

Нормальные исключения, пользуйся. То что они медленные - это же исключения, не надо на них штатную логику строить. Исключения для ошибок исключительно.

Везде в своих проектах использую и не знаю как бы я без них обходился. Коды возврата - это же пипец.

Важно, чтобы применялся для всего один и тот-же компилятор, тогда и проблем не будет.

navrocky
()
Последнее исправление: navrocky (всего исправлений: 1)

эксепшены в плюсах реализованы через жопу, и что в отличие от какой-нибудь там джавы

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

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от navrocky

А мне так наоборот исключения не нравятся. Вот например если программа в асинхронном стиле(при использовании скажем boost asio), то там исключения очень сильно усложнили бы жизнь. Но тем не менее приходиться ими пользоваться, т.к. во многих библиотеках они используются. Было здорово, если бы в плюсах был бы обязательный закон - если есть функция/метод с исключением, то обязан быть и этот же перегруженный метод/функция без исключений, а с аргументом в который запишется код возврата.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

то обязан быть и этот же перегруженный метод/функция без исключений, а с аргументом в который запишется код возврата

В operation+() как дополнительный параметр передавать?

no-such-file ★★★★★
()
Ответ на: комментарий от rumgot

а с аргументом в который запишется код возврата

да, мы уже проходили это с функциями типа atoi. Ошибку обработки строки никак не получить, на кривых строках возвращает всегда 0. И таких примеров по 200 штук на стоню строк кода таких как вы

Думаю вам надо пойти из крестов в rust и не морочить никому голову

anonymous
()
Ответ на: комментарий от rumgot
>Было здорово, если бы в плюсах был бы обязательный закон
>rumgot ★ (02.02.2017 18:25:27) Зашивает ребёнку gps-трекер
Просто садитесь в тюрьму, там всё как вы любите.
d_a ★★★★★
()
Ответ на: комментарий от anonymous

Ошибку обработки строки никак не получить, на кривых строках возвращает всегда 0
Думаю вам надо пойти из крестов в rust и не морочить никому голову

Сделать нормальную версию atoi без исключений возможно и в С++, раст для этого не обязателен.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Сделать нормальную версию atoi без исключений возможно и в С++, раст для этого не обязателен.

можно, конечно, но нормальной версией она от этого не станет

anonymous
()
Ответ на: комментарий от utf8nowhere

Не все пользуются браузерами со встроенным просмотрщиком.

morse ★★★★★
() автор топика
Ответ на: комментарий от rumgot

Не вижу проблемы в обработчике обернуть код в try/catch и обработать ошибки как следует.

Не обработал - упало, значит надо обратить внимание и обработать.

А вот с кодами возврата - забыл проверить и будет работать как ни в чём не бывало и узнаешь ты об ошибках с удивлением хрен знает через сколько.

В общем, коды возврата - прошлый век. Пережиток прошлого. Я кончил.

navrocky
()
Последнее исправление: navrocky (всего исправлений: 1)
Ответ на: комментарий от intelfx

Так я спокоен. А ты резко разговариваешь слишком. Подлечи нервишки и постригись, сэкономишь на шампуне.

rumgot ★★★★★
()
Ответ на: комментарий от navrocky

забыл проверить

В нормальных компиляторах и либах будет варнинг о не использованном значении.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

можно, конечно, но нормальной версией она от этого не станет

Почему?

DarkEld3r ★★★★★
()
Ответ на: комментарий от RazrFalcon

К если возвращать объект, можно в нем держать флаги состояния, которые можно проверить. Или костыль?

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

Или костыль?

Костылем можно назвать абсолютно все, и самы эксепшены в том числе. Механизмы есть разные, и для каждого можно найти применение. Я же просто хотел узнать технические особенности реализации исключений в плюсах, чтобы делая выбор в пользу какого-нибудь механизма, основываться на фактах, а не на «нравится/не нравится».

morse ★★★★★
() автор топика
Ответ на: комментарий от rumgot

Вы про isValid()? На этом весь Qt построен. Но я не считаю это нормальной практикой. Нужен тип result и всё. Костылять isValid для всех типов - тупняк.

RazrFalcon ★★★★★
()
Ответ на: комментарий от morse

Я советую исключения. Недавно была статья о исключениях и их производительности. Найду - скину. Если кратко, то современные исключения имеют ничтожные накладные расходы, а в некоторых случаях даже меньше чем коды возврата.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Вы про isValid()? На этом весь Qt построен. Но я не считаю это нормальной практикой. Нужен тип result и всё. Костылять isValid для всех типов - тупняк.

у тебя в профиле на гитхабе написанно что ты кодишь на Qt, а не на C++

иди в rust и не морочь людям голову

anonymous
()
Ответ на: комментарий от RazrFalcon

А у тебя написано, что ты аноним, но это не мешает тебе выражать тебе своё мнение.

аж запинался как писал)

да ты не расстраивайся, многие даже rust не могут освоить

anonymous
()
Ответ на: комментарий от RazrFalcon

Найду - скину. Если кратко, то современные исключения имеют ничтожные накладные расходы, а в некоторых случаях даже меньше чем коды возврата.

Очень интересно, подписался.

CrossFire ★★★★★
()

Плюсы без эксепшенов - это не плюсы, а сишечка с классами. Для каких-то задач подходит, но называть это плюсами - увольте. Под плюсами в 2017 году понимают что-то не ниже c++11.

anonymous
()
Ответ на: комментарий от morse

Я же просто хотел узнать технические особенности реализации исключений в плюсах

Ты какую-то фигню хотел узнать, честное слово. Реализаций компиляторов C++ - вагон и маленькая тележка. Это тебе не жаба и не новомодные язычки, где эталонная реализация является единственной. В С++ если тебя не устраивает поддержка чего-либо, то ты просто берешь другой компилятор. Все компиляторы где исключения были реализованы криво или медленно уже давным давно отсеелись естественным отбором.

asaw ★★★★★
()
Ответ на: комментарий от rumgot

Так ведь не нужно забывать.

Да, это проблема, согласен. Но и про коды возврата надо помнить. Да и вообще в плюсах надо много чего помнить, чтобы на грабли не наступить.

Но, блин, удобней же на порядок с исключениями код писать. Причем, я всегда реализую свои классы исключений, со всякими сервисными функциями, такими как встроенное форматирование строки, идентификаторы, стектрейсы. Конечно не java/.net, но уже не так плохо.

navrocky
()
Ответ на: комментарий от RazrFalcon

Если кратко, то современные исключения имеют ничтожные накладные расходы

Ну там этого не написано, там есть частный случай где они быстрее. Вот пример разницы в 30 раз в пользу кодов возврата: https://youtu.be/oXw2vXOUr1g?t=3m50s

CrossFire ★★★★★
()
Ответ на: комментарий от asaw

Все компиляторы где исключения были реализованы криво или медленно уже давным давно отсеелись естественным отбором.

Такие ещё поискать надо, за 15 кодинга на плюсах я с такими не сталкивался.

navrocky
()
Ответ на: комментарий от CrossFire

Ну надо сказать что в видосике тоже случай специфичный. Там исключения бросаются в 50% вызовов, а код возврата реализован через bool. Статейка честнее - они рассмотрели два параметра: глубина стека и вероятность исключения. Причем вероятность более вменяемая - менее 10%. А ошибка при этом - честный struct со строкой, а не читерский bool.

Но вывод прямо противоположный: в реальной жизни (невысокий стек вызова) коды возврата быстрее уже с вероятности 1-2%. эксепшены быстрее только на чистом коде.

morse ★★★★★
() автор топика
Ответ на: комментарий от asaw

Реализаций компиляторов C++ - вагон и маленькая тележка.

И что? Это как-то влияет на мой вопрос? Если ты такой знаток различных реализаций, то и расскажи, где и какой подход применен, и где и какой подход эффективнее.

morse ★★★★★
() автор топика
Ответ на: комментарий от CrossFire

Если точнее, то там написано, что всё зависит от ситуации. И ручной проброс значение будет медленнее исключений. Особенно учитывая то, что исключения можно ловить разных типов, в отличии от.

RazrFalcon ★★★★★
()

исключения можно сравнить с ассертом, только ассерт это стиль С а исключения это стиль С++
скорость тоже нормальная, в гцц сменилось не одно поколения реализации исключений на низком уровне

anonymous
()
Ответ на: комментарий от anonymous

исключения можно сравнить с ассертом

Божечки, откуда вы вылазите?

RazrFalcon ★★★★★
()
Ответ на: комментарий от asaw

Ага, то есть болтовня про «вагон реализаций» оказалась болтовней, а в реальной жизни все свелось к одному единственному методу, так?

Кстати, судя по статейке сверху, у шланга с эксепшенами дела сильно лучше чем у гцц. Осталось только узнать как там дела у микрософта и у интела, и весь «вагон реализаций» будет исчерпан.

morse ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.