LINUX.ORG.RU

exceptions в C++

 ,


5

9

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

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

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

★★★★★

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

Ответ на: комментарий от numas13

В С++ достаточно инструментов, чтобы сделать так же, при желании.

Покажите в коде.

Так ведь panic — это исключительная ситуация, после которой невозможно восстановить исполнение потока управления. Глупо его сравнивать с ошибками.

А почему не сразу всего приложения?

Надо различать ошибку и исключительную ситуацию.

И как, например? bad_alloc — это ошибка или исключительная ситуация? Обращение по неправильному индексу — это ошибка или исключительная ситуация?

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

Покажите в коде.

Я уже показал, в С++ можно так же, за исключением сахара в виде ?. Зачем ты лезешь в тему, если не знаешь С++?

А почему не сразу всего приложения?

А зачем всего приложения?

И как, например? bad_alloc — это ошибка или исключительная ситуация? Обращение по неправильному индексу — это ошибка или исключительная ситуация?

Если ты предусмотрел их обработку, то ошибка, в противном случае исключительная ситуация.

Ошибка.

match v.get(index) {
    Some(value) => do_work,
    None => handle_error,
}

Исключительная ситуация.

v[index]

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

Я уже показал, в С++ можно так же, за исключением сахара в виде ?.

Код покажите. На C++. Тогда можно будет говорить.

А зачем всего приложения?

А зачем всего потока?

Если ты предусмотрел их обработку, то ошибка, в противном случае исключительная ситуация.

Прелестно. И как это определить в момент диагностики ошибки? Вот, например, в std::vector::at(i) обнаружили, что i>=size(). И? Подавать это как ошибку или как исключение?

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

Так в чём таки посыл того примера, который Вы привели в качестве преимущества исключений в этом сообщении

Так попробуйте переписать без исключений, может поймете.

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

Так попробуйте переписать без исключений, может поймете.

Ну вот, вместо прямого ответа Вы начинаете юлить. Напрашивается простой вывод, что Вы некомпетентны. Но рассуждаете об. И не понятно, о чём с вами дискутируют собеседники, если вы не понимаете примера, который приводите как преимущество исключений перед кодами возврата.

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

Ну расскажите, расскажите же наконец, чего я не понимаю в приведенном мной коде. Если уж свой представить не можете.

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

Напрашивается простой вывод, что Вы некомпетентны

Так, к слову: у сторонних зрителей возникают совсем другие выводы.

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

Да пожалуйста, я не гордый.

Этот код показывает только удобство использования функций библиотеки stl по сравнению с функциями библиотеки С. Никаких преимуществ исключений он не демонстрирует, просто потому, что там нет ни одного перехвата исключения. Но если их туда добавить, то код уже не будет выглядеть так просто и красиво. И местами станет намного хуже читаем, чем с проверками возвращаемого значения. Даже этот пример из нескольких строк.

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

Этот код показывает только удобство использования функций библиотеки stl по сравнению с функциями библиотеки С.

А теперь задайте себе вопрос: почему так? Что дает возможность безопасно использовать библиотеку, не контролируя результат каждого действия, но не имея шансов просто так проигнорировать возникающие ошибки?

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

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

И это я говорю не на пустом месте. Я с таким сталкивался на вполне серьёзных проектах.

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

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

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

И ещё. Этот пример, котоый вы привели, показывает только удобство. Всё, что касается обработки ошибок, там намеренно убрано, чтобы не перегружать пример лишними сущностями. Так что ни о какой безопасности этого примера говорить нельзя. Он не об этом. Но Вы этого не понимаете.

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

Что значит безопасно?

Значит что нельзя перейти к выполнению следующего действия, если предыдущее завершилось неудачно.

Исключения не гарантируют безопасности выполнения кода

А масло масляное. Исключение — это лишь способ сообщить о наличии проблемы. Причем такой способ, который просто так не проигнорируешь.

Там ведь нет перехвата исключений.

Да вы путаете информирование об ошибках и обработку ошибок. С чего бы это? Компетентность зашкаливает, наверное.

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

Значит что нельзя перейти к выполнению следующего действия, если предыдущее завершилось неудачно.

И как определить, которое из действий завершилось неудачно? Конечно, если всё вывалится на первом же вызове, то и наплевать. Ничего не создалось, и слава богу. Но если не выполнится любая из следующих функций, то, как минимум, в ФС останется мусор, а если только последняя, то в файловой системе останутся неудалённые файлы. Или, в случае работы с реальными данными, вероятно, секретная информация.

А масло масляное. Исключение — это лишь способ сообщить о наличии проблемы. Причем такой способ, который просто так не проигнорируешь.

Ну как же не проигнорируешь? Вы его прекрасно игнорируете, рискуя засрать файловую систему и разбазарить секреты. И называете это «безопасным выполнением».

Да вы путаете информирование об ошибках и обработку ошибок. С чего бы это? Компетентность зашкаливает, наверное.

Поясните, как я путаю информирование об ошибках и обработку ошибок.

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

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

Поэтому в нем нет ни try/catch, ни каких-либо действий по откату выполненных на ФС операций.

Повторю еще раз, специально для столь компетентного эксперта, как вы: это сделано специально.

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

В том числе и на тему того, как строить разработку с использованием исключений так, чтобы автоматически выполнялся откат незавершенных «транзакций» при пробросе исключений. Это тема для отдельного большого разговора. Но сперва хотелось бы убедиться, что вы в состоянии понять то, о чем вам говорят.

А то вот такие перлы вызывают в этом серьезные сомнения:

Ну как же не проигнорируешь? Вы его прекрасно игнорируете, рискуя засрать файловую систему и разбазарить секреты. И называете это «безопасным выполнением».

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

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

Как ты догадался, о отец проницательности?

Их там нет специально, потому, что пример должен был показать не механизм обработки, а механизм информирования об ошибках. Кроме того, пример должен был быть достаточно простым и компактным, дабы его можно было разместить здесь и для того, чтобы приверженцы кодов ошибок могли без особого труда его переписать.

Да ты просто врёшь! Там, где ты перданул этот код, нет ни слова о механизмах обработки и информирования. Вот твои же слова:

И пробуем переписать все это без исключений, на кодах возврата. Насколько будет проще/лаконичнее/удобнее/надежнее?

Давай, расскажи нам, как из слов «проще/лаконичнее/удобнее/надежнее» составить слова «механизмы обработки и информирования об ошибках»?

Поэтому в нем нет ни try/catch, ни каких-либо действий по откату выполненных на ФС операций.

Опять врёшь. В нем нет try/catch не поэтому, а потому что авторы кода их ту да не добавили. А не добавили потому, что там говорится не об обработке исключенияй, а о directory_iterator'е. Но ты не удосужися подумать, о чём там речь. Тебе главное, что строчечки красивые и что можно порожняк оппоненту кинуть, мол напиши также на кодах возврата.

Повторю еще раз, специально для столь компетентного эксперта, как вы: это сделано специально.

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

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

Опять порожняк гонишь. Для начала я не увидел обработки исключений в приведённом тобой коде. Давай, напиши. Только после этого можно будет вернуться к продолжению разговора.

В том числе и на тему того, как строить разработку с использованием исключений так, чтобы автоматически выполнялся откат незавершенных «транзакций» при пробросе исключений. Это тема для отдельного большого разговора. Но сперва хотелось бы убедиться, что вы в состоянии понять то, о чем вам говорят.

Ну-у... Совсем поплыл. Что, уже всё так плохо, что с темы съезжать начал? Появились новые слова: разработка, откат, транзакция, сброс исключений. Нет, дебилушка, так дело не пойдёт. Разберись сначала с теми пятью строками, что ты нам подсунул, а потом, может быть, мы поговорим на эту большую тему. Если я сочту результат твоих потуг достойным продолжения.

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

Разговорчивый вы наш, вот эти мои слова остаются в силе:

И пробуем переписать все это без исключений, на кодах возврата. Насколько будет проще/лаконичнее/удобнее/надежнее?

Код покажите, простынями текста срать не сложно. Особенно когда не понимаете о чем речь.

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

Слился ты дружок. Обосрался по полной программе.

Обычно такие фразы:

alexku> Если я сочту результат твоих потуг достойным продолжения.

говорят, чтобы выйти из разговора гордым победителем %)

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

Ба, да это ж сам царь со мной разговаривал!

Проссыте, не узнал вас в гриме.

eao197 ★★★★★
()

тред чудовищен. исключения в с++ раскручивают стек и вызывают деструкторы всех объектов которые встречаются на пути. они не тормозят потому что «в с++ тормозные исключения», а потому что приходится удалять всё то говнецо которе вы насоздавали до обработчика исключения.

в языках со сборщиками мусора стек тоже раскручивается, но деструкторы не вызываются, объекты вместо этого просто помещаются в мусор и всё это тормозит потом, когда вызывается сборщик мусора.

вот и всё. теперь вы знаете.

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

Прекрасно. Но это код на Rust-е, а не на C++.

Ну так С++ разрабатывался во время, когда ООП было серебряной пулей. Об алгебраических типах товарищ Страуструп задумался ближе к 2013-му году. http://www.stroustrup.com/OpenPatternMatching.pdf

Так что ничего странного, что в С++ удобно работать с кодами возвратов пока не получится.

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

Так что ничего странного, что в С++ удобно работать с кодами возвратов пока не получится.

Для меня это очевидно. Не очевидно, почему же при этом так много людей агитируют за отказ от использования исключений в C++ и за переход на коды возврата.

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

Так что ничего странного, что в С++ удобно работать с кодами возвратов пока не получится.

В Си++ получится работать с кодами возврата гораздо удобнее, чем, например, в Си (в которм свои ADT просто не сделаешь). При том, что и в Си люди вполне живут.

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