Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
#1

ф-ция с throw - C++

25.05.2012, 23:40. Просмотров 3193. Ответов 29
Метки нет (Все метки)

Встретил такую мне незнакомую запись:

C++
1
2
3
4
тип имя_функции( параметры ) throw(что-то)
{
тело_ф-ции
}
Что дает такая запись с throw ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2012, 23:40     ф-ция с throw
Посмотрите здесь:

C++ Throw exceptions
C++ Операторная ф-ция
C++ throw, try, catch
Try..catch..Throw C++
try-throw-catch C++
C++ ф-ция
C++ try, catch, throw
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vpnwz151
10 / 11 / 1
Регистрация: 03.11.2011
Сообщений: 129
25.05.2012, 23:52     ф-ция с throw #2
Обрабатывает исключения
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
26.05.2012, 00:03  [ТС]     ф-ция с throw #3
Обрабатывает исключения
т.е. ?
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
26.05.2012, 00:03     ф-ция с throw #4
vpnwz151, Неверно. Указывает спецификацию исключений, какие исключения может выбрасывать сея функция.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
26.05.2012, 00:05  [ТС]     ф-ция с throw #5
ForEveR
Т.е ф-ция игнорирует некоторые исключение и продолжает выполнятся без прерывания?
Не встречал просто такое в литературе...
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
26.05.2012, 00:12     ф-ция с throw #6
Avazart, Вообще стоит почитать стандарт, но сейчас мне его открывать лень, так что скажу как предполагаю. Если функция выкинет исключение, которое не описано в ее спецификаторе исключений, сгенерируется unexpected

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdexcept>
#include <iostream>
 
void func() throw(std::logic_error)
{
   throw std::runtime_error("some");
}
 
void handler()
{
   std::cout << "unexpected exception" << std::endl;
}
 
int main()
{
   std::set_unexpected(handler);
   try
   {
      func();
   }
   catch (const std::exception& e)
   {
      std::cerr << e.what() << std::endl;
   }
}
http://liveworkspace.org/code/f5e48b...536935fa44d617
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
26.05.2012, 00:30  [ТС]     ф-ция с throw #7
Чесно говоря не особо понятно...
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
26.05.2012, 00:45     ф-ция с throw #8
Avazart, Я и сам не вьехал в эту фигню, но вообше throw используются для исключительных сютуациий. Ну например есть у тя калькулятор - а пользователь вел деление на 0, так программа глюкане, а с throw напишет ошибку(без вылета).
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
26.05.2012, 00:48  [ТС]     ф-ция с throw #9
cactus09, да это понятно- это в любой книге по С++ есть.
Вопрос в том что она дает именно при использзовании с ф-цией? В чем отличие в работе ф-ции с throw и без него.

Ну и из приведенного примера понимаю что надо почитать где-то про типы std-исключений...
cactus09
Чайник
69 / 69 / 4
Регистрация: 15.02.2012
Сообщений: 475
26.05.2012, 00:56     ф-ция с throw #10
Цитата Сообщение от Avazart Посмотреть сообщение
cactus09, да это понятно- это в любой книге по С++ есть.
Вопрос в том что она дает именно при использзовании с ф-цией? В чем отличие в работе ф-ции с throw и без него.

Ну и из приведенного примера понимаю что надо почитать где-то про типы std-исключений...
Я вообше из привиденного примера понял что для меня стандартное пространство имен std темный лес
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
26.05.2012, 00:59  [ТС]     ф-ция с throw #11
Ну и из приведенного примера понимаю что надо почитать где-то про типы std-исключений...
Буду признателен если кто-то подкинет ссылку (можно на лит-ру) по данным исключениям....
rangerx
1922 / 1531 / 139
Регистрация: 31.05.2009
Сообщений: 2,894
26.05.2012, 01:22     ф-ция с throw #12
Avazart, грубо говоря, это значит, что любое сгенерированное исключение тип которого не указан в списке throw, должно быть обработано непосредственно внутри этой функци.
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
26.05.2012, 01:36     ф-ция с throw #13
Цитата Сообщение от Avazart Посмотреть сообщение
Буду признателен если кто-то подкинет ссылку (можно на лит-ру) по данным исключениям....
С. Мейерс. Наиболее эффективное использование C++. Правило 14.
Г. Саттер. Новые сложные задачи на C++. Задача 13.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
26.05.2012, 04:00  [ТС]     ф-ция с throw #14
Еще раз спасибо за пример и литературу!
Нарушение спецификации
1. Что произойдет при нарушении спецификации исключений? Почему? Каковы основ¬ные причины существования этой возможности С++?
Идея спецификаций исключений заключается в проверке времени выполнения того, что данная функция может генерировать только определенные типы исключений (либо не генерировать их вовсе). Например, приведенная ниже спецификация исключений гарантирует, что f может генерировать только исключения типа А или B24:

24-Говоря точнее, если окружить эту функцию try/catch блоками для перехвата исключений А и B, то все возможные исключения будут перехвачены — в частности, такая функция может генерировать исключения, являющиеся производными классами от А и В. — Прим. ред.
C++
1
int f()  throw( A,B );
Если будет сгенерировано исключение, которого нет в списке спецификации исключений, будет вызвана функция unexpected().
C++
1
2
3
int f()  throw(A,B)  { // А и в не связаны с C
throw C();               // будет вызвана функция unexpected
}
Вы можете зарегистрировать ваш собственный обработчик для этого случая при помощи стандартной функции set_unexpected. Ваш обработчик не должен получать никаких параметров и не должен возвращать никаких значений.
C++
1
2
void MyUnexpectedHandler()  { /*  ...  */ } 
std::set_unexpected( &MyUnexpectedHandler  );
Остается один вопрос — что может делать ваш обработчик? Единственное, чего он не может делать, — это выйти из функции при помощи оператора return. Поэтому у него есть два варианта действий:
• преобразовать исключение в другое, допустимое спецификацией исключений, путем генерации исключения типа, имеющегося в списке спецификации исключений, вызвавшего вызов обработчика. Свертка стека при этом продолжится с того места, где она остановилась;
• вызвать функцию terminate, которая завершает работу программы. (Функция terminate также может быть заменена другой, но в любом случае она должна завершить выполнение программы.)
Применение
Идея, лежащая в основе спецификаций исключений, очень проста: в программе C++ любая функция, если не указано иное, может генерировать исключения любого типа. Рассмотрим некоторую функцию Func.
2. Какие исключения могут быть сгенерированы каждой из перечисленных ниже функций.
C++
1
int Func();            // может генерировать любые исключения
По умолчанию в C++ функция Funс может генерировать исключения любого типа, как сказано в комментарии к ней. Однако зачастую нам известно, что функция может генерировать только исключения определенных типов. В таком случае может оказаться разумным сообщить об этом компилятору и программисту.Например:
C++
1
2
int Gunc()  throw();        // не генерирует исключений
int HunсО  throw(A,B);   // может генерировать только а или в
В приведенном примере спецификации исключений использованы для того, чтобы дать дополнительную информацию о функциях, а именно — о типах исключений, которые они могут генерировать. Комментарии, приведенные рядом с функциями, переводят спецификации исключений на обычный русский язык.
Первая мысль по этому поводу — чем больше информации, тем лучше, так что указание спецификации исключений функции — это всегда не плохо. Но это не обязательно так, поскольку зачастую в излишней детализации и кроется зло: хотя намерения у спецификаций исключений и благие, вымощенный ими путь может завести нас не совсем туда, куда хотелось бы.
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 09:09     ф-ция с throw #15
Не надо throw пользоваться, это практически бесполезный и непереносимый модификатор.
В компиляторах, соответствующих стандарту, throw замедляет рантайм. В VC++ еще веселее - там компилятор считает, что могут генирироваться лишь те исключения, которые указаны в throw(...). Естественно, по стандарту это далеко не так.
Что касается того, что делает throw с типами - вообще молчу, это терминальный ****ц.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,944
Записей в блоге: 17
26.05.2012, 15:55  [ТС]     ф-ция с throw #16
Ну да я прочитал про спецификацию, и там говорят почему не рекомендуется использовать её.
В компиляторах, соответствующих стандарту, throw замедляет рантайм.
Имеется ввиду обычный throw/catch -блок?
Об этом можно по подробнее?
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 16:01     ф-ция с throw #17
Цитата Сообщение от Avazart Посмотреть сообщение
Имеется ввиду обычный throw/catch -блок?
Об этом можно по подробнее?
Ну, допустим, мы имеем такую функцию
C++
1
void foo() throw(...)
Затем в этой функции появляется некое исключение.
Тип этого исключения по очереди сравнивается с каждым элементом списка в throw(...), если этого типа там нету, то вызывается unexpected.

Как-то так, но точно не помню, у Саттера это более подробно описано.
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
26.05.2012, 16:03     ф-ция с throw #18
diagon, ну так ты имел ввиду не пользоваться спецификациями исключений, или исключениями вообще?
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 16:08     ф-ция с throw #19
Цитата Сообщение от grizlik78 Посмотреть сообщение
diagon, ну так ты имел ввиду не пользоваться спецификациями исключений, или исключениями вообще?
В данном случае спецификациями.
А вообще я и обычные исключения избегаю, ибо раньше я думал, что понимаю их, но потом понял, насколько геморройно писать безопасный с точки зрения исключений код.
Не зря же в google coding style, к примеру, от исключений отказались вообще.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 16:11     ф-ция с throw
Еще ссылки по теме:

C++ Throw()
Noexcept и throw() C++
C++ Try,catch,throw,OVERFLOW!
C++ Объясните синтаксис throw
C++ Try, catch, throw

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
26.05.2012, 16:11     ф-ция с throw #20
исключения в принципе тормозят рантайм, ибо юзают рантайм идентификацию типов (которую сволочи не захотели предоставить программистам, якобы дабы не портя статик-идеологии языка).

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

Добавлено через 54 секунды
Цитата Сообщение от diagon Посмотреть сообщение
Не зря же в google coding style, к примеру, от исключений отказались вообще.

Не отказались. Лишь признали правомерность исключений исключительно в исключительных ситуациях, но не в качестве штатной работы.
Yandex
Объявления
26.05.2012, 16:11     ф-ция с throw
Ответ Создать тему
Опции темы

Текущее время: 14:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru