Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> throw в прототипе функции, для чего? 
:(
    Опции темы
wowka19
Дата 2.10.2012, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Наткнулся вот на такой метод:
Код

virtual HRESULT Method(Type *&param) throw() = 0;


Я в курсе про исключения, но когда оно возникает в теле функции, поэтому код выше ввел меня в ступор.
Объясните пожалуйста для чего там throw() ?
PM MAIL   Вверх
xvr
Дата 2.10.2012, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(wowka19 @  2.10.2012,  15:03 Найти цитируемый пост)
Объясните пожалуйста для чего там throw() ?

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

PM MAIL   Вверх
wowka19
Дата 2.10.2012, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



а в чем тогда суть?
PM MAIL   Вверх
xvr
Дата 2.10.2012, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(wowka19 @ 2.10.2012,  15:20)
а в чем тогда суть?

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

PM MAIL   Вверх
wowka19
Дата 2.10.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



так, ладно. Пустой throw() говорит о том что метод исключений бросать не может, отсюда возможен профит в виде оптимизации бинарного кода.
Тогда возникают два вопроса:
1. Почему это оооочень редко встречается, ведь несложно это добавить к прототипу... хуже точно не будет (как inline) ?
2. Говоришь, что можно после throw() перечислить исключения. А тогда тут в чем смысл?
PM MAIL   Вверх
Alexeis
Дата 2.10.2012, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(xvr @  2.10.2012,  16:38 Найти цитируемый пост)
Например не генерить каких то структур необходимых для обработке возможных исключений при вызове метода.

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Amp
Дата 2.10.2012, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Цитата(wowka19 @  2.10.2012,  16:20 Найти цитируемый пост)
1. Почему это оооочень редко встречается, ведь несложно это добавить к прототипу... хуже точно не будет (как inline) ?
2. Говоришь, что можно после throw() перечислить исключения. А тогда тут в чем смысл? 

Потому что компиляторы это поддерживают через пень-колоду. Смысл throw(...) в том, что в случае выброса исключения, которое не обозначено в списке, будет вызван установленный unexpected_handler. Как-то так.
PM MAIL   Вверх
wowka19
Дата 2.10.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Alexeis, звучит логичнее... что-то типа const - на бинарный код влияния никакого не оказывает, а вот программиста подстраховывает.
PM MAIL   Вверх
Alexeis
Дата 2.10.2012, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Amp @  2.10.2012,  17:31 Найти цитируемый пост)
в том, что в случае выброса исключения, которое не обозначено в списке, будет вызван установленный unexpected_handler. Как-то так.

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
wowka19
Дата 2.10.2012, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



и как эта "неожиданность" отразится на ход программы, да и вообще что изменится если ты говоришь, что исключение в любом случае сработает несмотря на объявленный список?
PM MAIL   Вверх
Amp
Дата 2.10.2012, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Будет вызвана некоторая функция, которую ты установил через set_unexpected. По-умолчанию это terminate, которая завершает процесс. Ну и теоретически тебе позволяется обработать эту неожиданность и выбросить что-то более ожидаемое. Если ожидемое опять оказалось неожиданным, то неожиданное в определенных случаях заменяется на std::bad_exception. Короче попытка дать гарантии, что функция генерирует исключения именно те, которые у нее перечислены в throw().
PM MAIL   Вверх
kosmonaFFFt
Дата 2.10.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



В идеале компилятор должен бить по рукам при попытках бросить неописанное в списке исключение, а если оно вылетит, то вызывать unexpected handler, который можно установить самому, а так же оптимизировать код, если функция ничего не бросает... Но это в идеале, а в реальности у каждого компилятора это реализовано по своему, и проще вообще спецификацию исключений не писать... А в C++11 есть новое слово noexcept (или как-то так), которое говорит, что функция ну прям вообще 100% ничего не бросает...


--------------------
user posted image
PM MAIL ICQ   Вверх
Alexeis
Дата 2.10.2012, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Amp @  2.10.2012,  19:19 Найти цитируемый пост)
Будет вызвана некоторая функция, которую ты установил через set_unexpected. По-умолчанию это terminate, которая завершает процесс. 

  Это понятно, но если функцию не помечать как throw() , то поведение будет точь в точь. Точно также будет вызван обработчик unexpected handler и если там есть свой, то будет вызван свой. Почитал описание на сайте CplusPlus , там также не говориться ничего определенного на счет того как измениться поведение программы или компилятора.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Amp
Дата 2.10.2012, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: нет
Всего: 17



Цитата(Alexeis @  2.10.2012,  19:08 Найти цитируемый пост)
  Это понятно, но если функцию не помечать как throw() , то поведение будет точь в точь. Точно также будет вызван обработчик unexpected handler и если там есть свой, то будет вызван свой. Почитал описание на сайте CplusPlus , там также не говориться ничего определенного на счет того как измениться поведение программы или компилятора. 

Сейчас попробовал на gcc 4.7.1 - кастомный хэндрел не вызывается, если в сигнатуре throw отсутствует.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.