LINUX.ORG.RU

Расскажите о философии их использования

 ,


4

5

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

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

Приветствуются ссылки на статьи на русском и английском языках.

Так же можете оставлять свое собственное мнение о практике и философии использования исключений в с++ коде.

★★★★★

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

У вас логика хромает. Попробую вам пояснить на пальцах - я ссылки наизусть не знаю. Но умею пользоваться поисковой системой. Обучать вас этому полезному навыку я не имею никакого желания.

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

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

Культ карго. Не перегибай, это был пример, где использование исключений делает код быстрее и понятнее. Если ты не в состоянии это осознать, это печально. Если ты это осознаёшь только в виде «побежал применять», это печально.

Ладно, вот кусок кода: printf(«Exeptions in C++ is bullshit\n»);

Твой кусок кода написан на C.

stl

Есть разница между стандартной библиотекой и стандартной библиотекой шаблонов. ifstream бросает исключения.

Какое он вообще имеет отношение к плюсам?

Вот он ключевой момент. Ты пишешь не на C++, а на «Си с классами».

i-rinat ★★★★★
()
Ответ на: комментарий от andreyu

В любом из методов, где я сталкиваюсь с откровенным parse error я просто швыряю исключение, которое ловлю в точке начала парсинга и дальше уже говорю в гуе, что упс, parse error однако. Причем в виду наличия RAII у меня нигде по пути гарантированно не всё высвобождается.

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

Причем в виду наличия RAII у меня везде по пути гарантированно всё высвобождается.

Поправил.

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

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

Я сказал, что в коде Doom3 используются исключения. Это было ответом на:

andreyu> Использование исключений в играх, как минимум плохой тон. А вообще за это в геймдеве руки отрывают.

А статья - это ответ на то, что Кармак якобы говорил о себе «Си++ не знаю и использую как попало».

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

А статья - это ответ на то, что Кармак якобы говорил о себе «Си++ не знаю и использую как попало».

И ты считаешь, что эта статья опровергает его утверждение?!

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

А статья - это ответ на то, что Кармак якобы говорил о себе «Си++ не знаю и использую как попало».

И ты считаешь, что эта статья опровергает его утверждение?!

Я считаю, что утверждения «Си++ не знаю и использую как попало» вообще не было, а для этого привел статью с комментом Кармака. И не волнуйся так.

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

И не волнуйся так.

Хм, почему ты решил, что я волнуюсь!?

Только не говори, что из-за "?!", ведь я их заботливо ставлю специально для тебя (=

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

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

Кто-то спрашивает - зачем использовать исключения, я отвечаю - затем, что бы меньше писать кода.

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

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

"?!", ведь я их заботливо ставлю специально для тебя (=

За заботу спасибо, но обычно "!" ставят, чтобы обозначить восклицательную интонацию фразы.

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

обычно

Да, но ведь сейчас исключительная (no pun intended) ситуация, когда собеседником является шиза.

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

собеседником является шиза.

И что? Шизе, может, было бы простительно такое странное использование знаков пунктуации, но ты-то не шиза.

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

Я подумал. Нет, не является.

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

Ещё раз повторяю, тот кусок кода - прототип, что бы показать концепцию.

потому что не получится.

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

Ексепшины необходимы в случае фейла в констукторе. Тут один шибко умный анонимус упоминал понятие „корректного, но невалидного“ класса. Т.е. он предлагал делать так например:

SomeClass *s = new SomeClass;
if (!s->valid()) {
   delete s;
   return -1; //or some other appropriate error code or even goto, doesn't matter 

}
что то же самое, что и проверка кодов ошибок. Так вот за такое на рудники.

Короче, всё что хотел, я уже сказал. Кто хотел — тот понял. Не вижу смысла дискутировать дальше.

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

В любом из методов, где я сталкиваюсь с откровенным parse error я просто швыряю исключение, которое ловлю в точке начала парсинга и дальше уже говорю в гуе, что упс, parse error однако. Причем в виду наличия RAII у меня нигде по пути гарантированно не всё высвобождается.

Разумно, особенно если парсится ресурс, который обязательно должен быть целостным. Я на днях обнаружил в openmw бесконечный цикл при парсинге некоторых текстов из мира morrowind, там парсер работает в цикле и в определённый момент в конце итерации он производил сброс в исходное состояние, игра зависала напрочь. Как только вставил соответствующую проверку с выбросом исключения, зависание исчезло и игра просто стала отображать пустые страницы для таких книг.

Но если речь идёт о LL/LR/LALR парсере, то там вместо рекурсии стек и можно обойтись без исключений. Парсерам, умеющим восстановливаться после ошибки, исключения тоже повредят.

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

Т.е. он предлагал делать так

Нет, прости, я так не предлагал делать. Ты меня уже до слез довел, прекращай это дело.

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

Ещё раз повторяю, тот кусок кода - прототип, что бы показать концепцию.

По-моему тот кусок был просто попыткой давления на неопытного оппонента :D

Если же проект довольно большой, то написать обработку ексепшинов достаточно один раз в одном месте.

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

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

быдлокод, падающий при отсутсвии сети или от любой другой нештатной ситуации.

Ексепшины необходимы в случае фейла в констукторе.

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

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Говоришь о неких абстрактных статьях, но никак не можешь их найти.

Я их не ищу, мне без надобности. Все изучено давно.

Культ карго. Не перегибай, это был пример, где использование исключений делает код быстрее и понятнее. Если ты не в состоянии это осознать, это печально. Если ты это осознаёшь только в виде «побежал применять», это печально.

Если вы не в состоянии осознать, что переписать код без использования исключениний можно так, что он заработает существенно быстрее, то это печально.

Твой кусок кода написан на C.

А Страуструп с вами не согласен.

Есть разница между стандартной библиотекой и стандартной библиотекой шаблонов. ifstream бросает исключения.

И поэтому я должен ее заюзать?

Вот он ключевой момент. Ты пишешь не на C++, а на «Си с классами».

Ключевой момент в том, что в угоду удобству и скорости вы будете использовать ifstream там, где ему не место.

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

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

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

if(parse_error) { error |= PARSE_ERRROR; return false; }
Все, деструктор все освободит сам.
Зачем усложнять задачу там, где ее нужно упростить?

Причем в виду наличия RAII у меня нигде по пути гарантированно не всё высвобождается.

Не освобождается? Вы за утечку ресурсов?

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

Я сказал, что в коде Doom3 используются исключения. Это было ответом на:

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

А статья - это ответ на то, что Кармак якобы говорил о себе «Си++ не знаю и использую как попало».

Читал я статью, пустая она.

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

Не придумывай. :)

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

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

Это, я приношу свои искренние извинения. Хоть я и считаю, что опыта у тебя маловато, это не оправдывает мое поведение.

Что касается анонимности, проблема не в смелости, а в иррациональном желании нравиться всем без исключения.

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

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

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

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

Тут стоит задуматься о смене студии. Возможно ты связался с садистами, а не разработчиками игр, и битье рук это только начало. ;)

Я работаю на себя.

Зато в других подсистемах они бывают полезны. Поэтому, полность отмахиваться от них - глупо.

Ну ок, используйте, я не против.

Но, тебе это будет трудно понять,

Мы с вами знакомы, что бы вы могли утверждать подобное?

ведь ребята из playstation сказали...

Ну конечно, я не должен доверять ни своему опыту, ни опыту консольщиков. Я обязан доверится ЛОРовскому аналитику.

а попробовать самому у тебя духу не хватит,

Ну точно, мы с вами не знакомы, иначе бы вы не несли подобной чуши.

а то придут страшные мужики и надают по рукам.

Интересно, это какие мужики могут придти ко мне и начать диктовать свои условия?

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

Интересно, это какие мужики могут придти ко мне и начать диктовать свои условия?

Я полагаю, те про которых вы все время говорите: «просто бьют больно по ним. Или просто ссылают на обезьянью работу.» Эта фраза про отрывание/битье рук в этой теме скоро станет крылатой. Скажите, насколько у вас огромен опыт в гаймдеве, может есть готовые продукты, на которые можно взглянуть? Некоторые поделки ламера Кармака я видел, а вот ваши пока нет. Покажите?

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

В профиль же загляни.

Я заглядывал, поэтому и спросил, что есть посмотреть.

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

А как ты предлагаешь? Тупо не кидать исключение в конструкторе и оставлять «невалидный» объект. За такое с работы выгоняют.

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

Скажите, насколько у вас огромен опыт в гаймдеве,

Мое суждение о моем опыте будет сугубо субъективно, не так ли?
Но коль вы так настаиваете, то программировать я начал лет в 13 (о, получается, что уже 25 лет занимаюсь разработкой; пожалуй отмечу это дело сегодня). Сначала бейсик, потом плотно и надолго ассемблер для z-80, гораздо позже си и ассемблер для x86, после плюсы. Писал для различных платформ - powertv, pocket pc, mophun.

может есть готовые продукты, на которые можно взглянуть? Некоторые поделки ламера Кармака я видел, а вот ваши пока нет. Покажите?

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

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

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

Понимаете, если бы вы писали, только за себя я бы даже внимание не обратил на это, но вы решили ответить за всю отрасль... А тут нужны серьезные доводы, а у вас их нет. Кроме «я начал программировать в 13 лет».

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

Вы участвовали в крупных игровых проектах,

Как определить крупность проекта? По размеру кода, по бюджету, по количеству задействованных сотрудников, по прибыли в процентах от бюджета? Может как то еще?

работали в серьезных студиях

Что считать серьезной студией? Как отличить серьезную студию от несерьезной?

или вы только читали рекомендации ребят из playstation?

А это не серьезные ребята? Я Кармака должен слушать?

Есть крупные проекты, соизмеримые с работами ламера Кармака или нет?

Почему вы все время называете его ламером?
И да, игры Кармака мне не нравятся почти все.

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

О, у нас появился аналитик по фотографии.

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

Я ответил за ту отрасль, в которой работаю давно. Да, я не могу отвечать за id software, и прочих монстров. Я отвечаю только за то, что знаю.
Или я должен в конце каждой фразы специально для анонимуса написать «ИМХО»?

А тут нужны серьезные доводы, а у вас их нет.

Что для вас будет серьезным доводом? Слова Кармака - «я наконец то перешел на плюсы и начал использовать исключения»?

Кроме «я начал программировать в 13 лет».

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

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

Я думаю, что вы или даже не пробовали исключения или не умеете работать с ними. Почему исключения в геймдеве зло? Я, например, занят в хайлоде и даже там они почти всегда приемлемы. А злом они являются в различного рода железок от маршрутизаторов до всяких бортовых софтах. Тоже есть опыт. Но там и с точки зрения самих задач исключительных ситуаций практически не бывает - все ситуации должны восприниматься не как ошибка и должны быть каким-либо образом обрабатываться, при чем на том же уровне, где возникают...

Я другой анонимус, если что.

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

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

Даже странно, что в Аде есть исключения.

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

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

Или наоборот, я хорошо знаю исключения.

Почему исключения в геймдеве зло?

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

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

Этот довод говорит о моем опыте и мой опыт говорит, что исключения в геймдеве зло.

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

О, у нас появился аналитик по фотографии.

Да, я в состоянии по фотографии отличить FarCry от примитивного арканоида.

Что для вас будет серьезным доводом?

Дайте подумать... мы же в техразделе? Тогда какая-то техническая информация, показывающая полную не возможность использовать исключения в геймдеве. Рассказы «я начал программировать в 13 лет» и «ребята из playstation сказали» на такую информацию не тянут. Такие слезные истории, по крайней мере меня, не сильно впечатляют.

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

Если в игре возникает исключительная ситуация, то это плохо. Очень плохо.

Жесть. :)

И исключение в данном случае только спрячет ошибку.

Почему исключение спрячет ошибку? Куда оно ее спрячет?

Ассерт же жестко ткнет носом разработчика в ошибку. Хороший Assert вкупе с логированием поможет быстро локализовать и исправить ошибку.

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

О чем тут можно говорить? 8)

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

Даже странно, что люди путают исключения и ассерты.

Исключительная ситуация != исключение. Даже странно, что некоторые люди этого не знают.

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

ребята из playstation

(Это так важно, что я влезу.) Никого тут кроме меня не напрягает, что речь тут идёт о ребятах из игровой приставки? Я бы опасался иметь дело с человеком, который считает, что в игровых приставках живёт кто-то, дающий ему советы.

Все те доки, которые я видел, были озаглавлены «Sony Computer Entertainment».

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

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

Если вы погуглите, то найдете подтверждение моих слов.

Да, я в состоянии по фотографии отличить FarCry от примитивного арканоида.

А, вот оно что, Петрович.

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

Почему невозможно? Можно, но не нужно.

Рассказы «я начал программировать в 13 лет»

Как вас это задело. Вы же сами попросили рассказать о моем опыте.

и «ребята из playstation сказали» на такую информацию не тянут.

Вы так и не ответили, почему Кармак является показателем, а «ребеята из playstation» нет?

Такие слезные истории, по крайней мере меня, не сильно впечатляют.

Ну расскажите свою.

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

Если в игре возникает исключительная ситуация, то это плохо. Очень плохо.

Жесть. :)

По вашему ошибка в игре - это хорошо?

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

Я понимаю, а вы судя по «проверяете результаты работы ассертами» нет.

andreyu ★★★★★
()
Ответ на: комментарий от i-rinat

(Это так важно, что я влезу.) Никого тут кроме меня не напрягает, что речь тут идёт о ребятах из игровой приставки? Я бы опасался иметь дело с человеком, который считает, что в игровых приставках живёт кто-то, дающий ему советы.

О, Петросян в треде.

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

петросян.жпг

Не жпг, а pdf. Искажение наименования говорит о том, что автор не видел этих самых гайдлайнов.

i-rinat ★★★★★
()
Ответ на: комментарий от andreyu

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

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

Если вы погуглите, то найдете подтверждение моих слов.

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

Можно, но не нужно.

Пруф.

Вы так и не ответили, почему Кармак является показателем, а «ребеята из playstation» нет?

Мы обсуждаем ваше заявление, о том что в геймдеве нельзя использовать исключения, а Кармак на своем опыте показывает, что можно. Так же это показывают разработчики Ogre3d, shadowgrounds, colobot и еще кучи других игровых проектов.

Как вас это задело.

Нет просто это очень по детски, вместо технической информации приводить свою автобиографию. :)

Ну расскажите свою.

У меня она такая же слезная, только я начинал на Commodore64. :)

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

Я понимаю, а вы судя по «проверяете результаты работы ассертами» нет.

Так просветите. :)

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

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

try {
  parse(data);
} 
catch(const &error) {
   ...
}

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