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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 17
#1

ф-ция с throw - C++

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

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

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

ф-ция - C++
Написать программу, проверяющую делимость целого числа на числа от 2 до 10. Проверка делимости на конкретное число должна быть реализована...

Throw() - C++
#include "stdafx.h" #include <iostream> using namespace std; void handler(double test) throw() { if (sizeof(double) ==...

Throw exceptions - C++
В массиве нужно отловить все исключения. Скока их ? Zerodevide,out_of_range_,wrong_type,bad_alloc. Привидите еще примеры.Желательно с...

try-throw-catch - C++
#include <iostream> #include <math.h> using namespace std; class Drob { public: int obchuslennia (int a, int...

Noexcept и throw() - C++
здравствуйте, подскажите, в каких случаях нужно использовать noexcept за исключением деструкторов и swap?

Try, catch, throw - C++
Подскажите, как с помощью try, catch, throw, обработать исключение на вводимый тип данных? Например, допускается только тип int, что...

try, catch, throw - C++
пишу класс namespace mystd { const uint32_t def_size = 1 << 20; //default memory container template<typename T> ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vpnwz151
10 / 11 / 1
Регистрация: 03.11.2011
Сообщений: 129
25.05.2012, 23:52     ф-ция с throw #2
Обрабатывает исключения
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 17
26.05.2012, 00:03  [ТС]     ф-ция с throw #3
Обрабатывает исключения
т.е. ?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.05.2012, 00:03     ф-ция с throw #4
vpnwz151, Неверно. Указывает спецификацию исключений, какие исключения может выбрасывать сея функция.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 17
26.05.2012, 00:05  [ТС]     ф-ция с throw #5
ForEveR
Т.е ф-ция игнорирует некоторые исключение и продолжает выполнятся без прерывания?
Не встречал просто такое в литературе...
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 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
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 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
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 17
26.05.2012, 00:59  [ТС]     ф-ция с throw #11
Ну и из приведенного примера понимаю что надо почитать где-то про типы std-исключений...
Буду признателен если кто-то подкинет ссылку (можно на лит-ру) по данным исключениям....
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
26.05.2012, 01:22     ф-ция с throw #12
Avazart, грубо говоря, это значит, что любое сгенерированное исключение тип которого не указан в списке throw, должно быть обработано непосредственно внутри этой функци.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
26.05.2012, 01:36     ф-ция с throw #13
Цитата Сообщение от Avazart Посмотреть сообщение
Буду признателен если кто-то подкинет ссылку (можно на лит-ру) по данным исключениям....
С. Мейерс. Наиболее эффективное использование C++. Правило 14.
Г. Саттер. Новые сложные задачи на C++. Задача 13.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 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);   // может генерировать только а или в
В приведенном примере спецификации исключений использованы для того, чтобы дать дополнительную информацию о функциях, а именно — о типах исключений, которые они могут генерировать. Комментарии, приведенные рядом с функциями, переводят спецификации исключений на обычный русский язык.
Первая мысль по этому поводу — чем больше информации, тем лучше, так что указание спецификации исключений функции — это всегда не плохо. Но это не обязательно так, поскольку зачастую в излишней детализации и кроется зло: хотя намерения у спецификаций исключений и благие, вымощенный ими путь может завести нас не совсем туда, куда хотелось бы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 09:09     ф-ция с throw
Еще ссылки по теме:

Try..catch..Throw - C++
Объясните пожалуйста разницу. Желательно с примерами, например деление на ноль, ну или чтобы было сразу несколько исключений. Расскажите...

Операторная ф-ция - C++
Добрый вечер, вот есть код: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;vector&gt; #include...

throw, try, catch - C++
Пожалуйста, помогите разобраться в том, что это такое, и как его правильно использовать. Где можно об этом почитать? P.S. только начал...

Рандомная ф-ция rand() - C++
Всем привет,объясните пожалуйста как работает рандомная ф-ция,например: rand()%10 == 5 rand()%15+2 rand()%5 == 1 rand()%5 ...

Функция со спецификацией throw - C++
Что такое функция со спецификацией throw(), и функция с конкретной спецификацией с подходящим стандартным исключением. Покажите...


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

Или воспользуйтесь поиском по форуму:
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.05.2012, 09:09     ф-ция с throw #15
Не надо throw пользоваться, это практически бесполезный и непереносимый модификатор.
В компиляторах, соответствующих стандарту, throw замедляет рантайм. В VC++ еще веселее - там компилятор считает, что могут генирироваться лишь те исключения, которые указаны в throw(...). Естественно, по стандарту это далеко не так.
Что касается того, что делает throw с типами - вообще молчу, это терминальный ****ц.
Yandex
Объявления
26.05.2012, 09:09     ф-ция с throw
Ответ Создать тему
Опции темы

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