![]() |
|
Модераторы: bsa |
![]()
|
|
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Наткнулся вот на такой метод:
Я в курсе про исключения, но когда оно возникает в теле функции, поэтому код выше ввел меня в ступор. Объясните пожалуйста для чего там throw() ? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
а в чем тогда суть?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Суть в том, что метод не может бросать исключения, и достаточно умный компилятор С++ может этим знанием воспользоваться при его вызове. Например не генерить каких то структур необходимых для обработке возможных исключений при вызове метода. |
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
так, ладно. Пустой throw() говорит о том что метод исключений бросать не может, отсюда возможен профит в виде оптимизации бинарного кода.
Тогда возникают два вопроса: 1. Почему это оооочень редко встречается, ведь несложно это добавить к прототипу... хуже точно не будет (как inline) ? 2. Говоришь, что можно после throw() перечислить исключения. А тогда тут в чем смысл? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Я думал это делается для того, чтобы он бил по рукам при попытке сделать throw внутри такого метода. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
Потому что компиляторы это поддерживают через пень-колоду. Смысл throw(...) в том, что в случае выброса исключения, которое не обозначено в списке, будет вызван установленный unexpected_handler. Как-то так. |
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Alexeis, звучит логичнее... что-то типа const - на бинарный код влияния никакого не оказывает, а вот программиста подстраховывает.
|
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Чем это поведение отличается от поведения по умолчанию? Если исключение есть в списке, то оно будет вызвано, если его нет, оно тоже будет вызвано, просто будет неожиданным для нижестоящей по стеку функции. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
и как эта "неожиданность" отразится на ход программы, да и вообще что изменится если ты говоришь, что исключение в любом случае сработает несмотря на объявленный список?
|
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
Будет вызвана некоторая функция, которую ты установил через set_unexpected. По-умолчанию это terminate, которая завершает процесс. Ну и теоретически тебе позволяется обработать эту неожиданность и выбросить что-то более ожидаемое. Если ожидемое опять оказалось неожиданным, то неожиданное в определенных случаях заменяется на std::bad_exception. Короче попытка дать гарантии, что функция генерирует исключения именно те, которые у нее перечислены в throw().
|
|||
|
||||
| kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
В идеале компилятор должен бить по рукам при попытках бросить неописанное в списке исключение, а если оно вылетит, то вызывать unexpected handler, который можно установить самому, а так же оптимизировать код, если функция ничего не бросает... Но это в идеале, а в реальности у каждого компилятора это реализовано по своему, и проще вообще спецификацию исключений не писать... А в C++11 есть новое слово noexcept (или как-то так), которое говорит, что функция ну прям вообще 100% ничего не бросает...
-------------------- ![]() |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Это понятно, но если функцию не помечать как throw() , то поведение будет точь в точь. Точно также будет вызван обработчик unexpected handler и если там есть свой, то будет вызван свой. Почитал описание на сайте CplusPlus , там также не говориться ничего определенного на счет того как измениться поведение программы или компилятора. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Amp |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 886 Регистрация: 17.2.2009 Репутация: нет Всего: 17 |
Сейчас попробовал на gcc 4.7.1 - кастомный хэндрел не вызывается, если в сигнатуре throw отсутствует. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |