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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
#1

Ограничения исключительных ситуаций f(.)throw(.){} - C++

07.08.2012, 13:09. Просмотров 1208. Ответов 20
Метки нет (Все метки)

Пробовал скомпилировать пример из Г. Шилдта [1]:

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
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
//Ограничения типов исключительных ситуаций, генерируемых функцией.
 
void Xhandler(int test)throw(char,double)
{
     if(test == 0) throw test;
     if(test == 1) throw 'a';
     if(test == 2) throw 123.23;
}
 
int main()
{
     cout << "Начало\n"
 
try
{
     Xhandler(0);
}
catch(int i)
{
     cout << "int" << endl;
}
catch(char)
{
     cout << "char\n";
}
catch(double)
{
     cout << "double\n";
}
cout << "Конец!";
return 0;
}
"Которая при попытке сгенерировать исключительную ситуацию типа не входящего в список throw, должна была завершиться аварийно"*[1]. Но она не завершается, а нормально работает...причем даже если поставить пустой параметр throw() при котором "функция Xhandler не может генерировать никаких исключительных ситуаций."[1]. Она все равно генерирует все, т.е. работает исправно...Что я не так понял???? Что я не так делаю? Вообще она работает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2012, 13:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ограничения исключительных ситуаций f(.)throw(.){} (C++):

Обработка исключительных ситуаций - C++
Помогите сделать обработку исключительных ситуаций вот мой код: #include &lt;iterator&gt; #include &quot;conio.h&quot; #include &lt;iostream&gt; ...

Обработка исключительных ситуаций. - C++
Пожалуйста,помогите решить..В субботу экзамен,а я физически не успеваю написать 6 программок..( Написать функцию вычисления...

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

Обработка исключительных ситуаций - C++
Нужна одна работающая программа из 2. 1) Наберите текст программы приведенного примера обработки исключительных ситуаций и...

Обработка исключительных ситуаций - C++
Мне нужно было создать шаблонный класс и написать обработку исключающих ситуаций. Вот, что я сделал #pragma once #include &lt;iostream&gt;...

Обработка исключительных ситуаций - C++
Всем доброго времени суток, не понимаю как сделать обработку исключительной ситуации когда при вводе количества строк, вводится не целое, а...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.08.2012, 14:36 #16
На самом деле все работает http://liveworkspace.org/code/4bc7ae...a965b7c452a268, просто у MSVC странная точка зрения на это, вызывает ли он terminate_handler сказать не могу.

Добавлено через 1 минуту
18.8.3.2
set_terminate
[set.terminate]
terminate_handler set_terminate(terminate_handler f) noexcept;
1 Effects: Establishes the function designated by f as the current handler function for terminating
exception processing.
2 Remarks: It is unspecified whether a null pointer value designates the default terminate_handler.
3 Returns: The previous terminate_handler.
[[noreturn]] void terminate() noexcept;
1 Remarks: Called by the implementation when exception handling must be abandoned for any of several
reasons (15.5.1), in effect immediately after evaluating the throw-expression (18.8.3.1). May also be
called directly by the program.
2 Effects: Calls the current terminate_handler function. [ Note: A default terminate_handler is
always considered a callable handler in this context. — end note ]
Но MSVC на это как бы класть
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 14:37  [ТС] #17
ок, подметим
Цитата Сообщение от ForEveR Посмотреть сообщение
Но MSVC на это как бы класть
, Спасибо)
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
07.08.2012, 14:38 #18
Alberto_Timakov, Я бы на вашем месте проверил как у MSVC в релизе с этим дела обстоят. Вполне возможно, что в debug версии он не зовется, а в релизе зовется.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 14:51  [ТС] #19
Цитата Сообщение от ForEveR Посмотреть сообщение
Вполне возможно, что в debug версии он не зовется, а в релизе зовется.
Если под релизом подразумевается то, что лежит в папке debug, то да, все работает, спасибо!)
Avazart
Эксперт С++
7148 / 5325 / 276
Регистрация: 10.12.2010
Сообщений: 23,566
Записей в блоге: 17
07.08.2012, 14:54 #20
Режим компиляции отладочный или итоговый подразумевается
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 15:42  [ТС] #21
Цитата Сообщение от Avazart Посмотреть сообщение
Режим компиляции отладочный или итоговый подразумевается
Я поставил Release "обозреватель решений->по проекту правой кнопкой->свойства->конфигурация = Release (было Debug)", нажал выполнить, выполнилось точно также как при конфигруации = Debug, т.е. сообщение "Новый обработчик terminate()" не вышло, а появилось сообщение "Необработанное исключение в "0x7c812aeb" в "Monstrr.exe": Исключение Microsoft C++: int по адресу 0x0012fea0..", но создалась папка Release. При запуске exe из Release и Debug есть небольшое различие в сообщение об ошибке. Но оба печатают мой текст "Новый обработчик terminate()". Или там еще где-то в настройках что-то изменить надо, чтобы при Release при выполнении из MVS выскакивала консолька с моим сообщением "Новый обработчик terminate()"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2012, 15:42
Привет! Вот еще темы с ответами:

Обработка исключительных ситуаций - C++
Правильно ли тут я обрабатываю исключения? #pragma once #include &lt;iostream&gt; #include &quot;stdio.h&quot; #include &quot;stdlib.h&quot; #include...

Обработки исключительных ситуаций - C++
Объясните, что от меня хотят, а то уже мозг кипит ... 7. Не абстрактный класс В является производным от абстрактного класса А. Определить...

Обработка исключительных ситуаций - C++
Здравствуйте, друзья. Подскажите, пожалуйста, как можно при помощи try-throw-catch &quot;защититься&quot; от ввода пользователем &quot;не того типа...

Обработка исключительных ситуаций - C++
Доброго времени суток уважаемы программисты и начинающие программисты :) Скажите, почему появляется ошибка на 6й строке? Задача стоит...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.08.2012, 15:42
Ответ Создать тему
Опции темы

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