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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 13:09     Ограничения исключительных ситуаций f(.)throw(.){} #1
Пробовал скомпилировать пример из Г. Шилдта [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++
Обработки исключительных ситуаций C++
C++ Обработка исключительных ситуаций
Обработка исключительных ситуаций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 13:13     Ограничения исключительных ситуаций f(.)throw(.){} #2
Alberto_Timakov, Не заморачивайтесь на этом. Компиляторы творят со спецификацией исключений, что хотят. По стандарту, если выкидывается исключение, не входящее в спецификацию, должна быть вызвана функция unexpected, которая по умолчанию вызывает std::terminate, так же можно написать свой хандлер, который будет либо вызывать abort/terminate либо кидать исключение допустимого типа (теоретически так можно, на практике - никогда не предусмотришь все возможные исключения). В С++11 спецификации исключений помечены как deprecated, так что не советую забивать себе голову этим.

http://liveworkspace.org/code/6ca760...5aaba2d72c8ea7
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 13:20  [ТС]     Ограничения исключительных ситуаций f(.)throw(.){} #3
ну ок...)

Добавлено через 31 секунду
Т.е. это совсем бесполезная штука?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 13:24     Ограничения исключительных ситуаций f(.)throw(.){} #4
Alberto_Timakov, Абсолютно. Единственное для чего она могла быть полезна - пустая спецификация исключений (throw()) - указывает, что функция не должна кидать исключений вообще, компилятор может произвести (а может и нет) некие оптимизации (или песимизации). В С++11 есть оператор noexcept(bool), который по сути является заменой спецификации исключений, если значение true - функция не имеет права кидать никаких исключений, если false то вполне имеет.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
07.08.2012, 13:25     Ограничения исключительных ситуаций f(.)throw(.){} #5
ф-ция с throw

Что означает "deprecated" ?
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 13:38  [ТС]     Ограничения исключительных ситуаций f(.)throw(.){} #6
Ну я так понял, что игнорирование этого списка исключений...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 13:38     Ограничения исключительных ситуаций f(.)throw(.){} #7
Avazart,
These are deprecated features, where deprecated is defined as: Normative for the current edition of the
Standard, but not guaranteed to be part of the Standard in future revisions.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
07.08.2012, 13:39     Ограничения исключительных ситуаций f(.)throw(.){} #8
Т.е. для соместимость с "прошлыми стандартами", но не гарантировано что будет потдерживаться в будующих версиях
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 13:43     Ограничения исключительных ситуаций f(.)throw(.){} #9
Avazart, Именно. Так же deprecated всякие биндеры (т.к. есть std::bind), auto_ptr (std::shared_ptr, std::unique_ptr, std::weak_ptr) и т.д.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
07.08.2012, 14:20     Ограничения исключительных ситуаций f(.)throw(.){} #10
Ну спецификация как бы вещь устарелая и не оправданная.
Может тоже касается std::bind, но указатели то почему к этому относятся? Особенно auto_ptr.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 14:25     Ограничения исключительных ситуаций f(.)throw(.){} #11
Avazart, Потому что auto_ptr - плохой смарт-пойнтер. У него очень странная семантика владения и т.д.
D.10
[depr.auto.ptr]
auto_ptr
The class template auto_ptr is deprecated. [ Note: The class template unique_ptr (20.7.1) provides a
better solution. — end note ]
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 14:29  [ТС]     Ограничения исключительных ситуаций f(.)throw(.){} #12
а вот еще вопрос,
Цитата Сообщение от ForEveR Посмотреть сообщение
По стандарту, если выкидывается исключение, не входящее в спецификацию, должна быть вызвана функция unexpected, которая по умолчанию вызывает std::terminate, так же можно написать свой хандлер, который будет либо вызывать abort/terminate либо кидать исключение допустимого типа
Написал, следующий код (Шилдт, аналогично на http://www.cplusplus.com/reference/s...set_terminate/ да и на этом форуме есть нечто похожее на что ответа нету...):
Но он почему-то не работает...что не так?

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
#include "stdafx.h"
#include <iostream>
#include <exception>
#include <locale>
#include <fstream>
 
using namespace std;
 
 
void MyTerminate()
{
    std::ofstream out("test", std::ios::out | std::ios::app);
    out << "Новый обработчик terminate()" << endl;
    out.close();
    abort();
}
 
int main(void)
{
    setlocale(LC_ALL,"Russian");
    set_terminate(MyTerminate);
 
    cout << "Начало \n";
    try
    {
        cout << "Внутри блока try" << endl;
        throw 100;
    }
    catch(double)
    {
        cout << "double" << endl; 
    }
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 14:31     Ограничения исключительных ситуаций f(.)throw(.){} #13
Alberto_Timakov, А. MSVC не вызывает unexpected.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 14:32  [ТС]     Ограничения исключительных ситуаций f(.)throw(.){} #14
Выдает сообщение "Необработанное исключение в "0x7c812aeb" в "Monstrr.exe": Исключение Microsoft C++: int по адресу 0x0012fea0..", а сообщения "Новый обработчик terminate()" не выдает...
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
07.08.2012, 14:32     Ограничения исключительных ситуаций f(.)throw(.){} #15
К тому же
C++
1
2
3
4
5
6
7
//...
   throw 100.0;
    }
    catch(double)
    {
        cout << "double" << endl; 
    }
либо

C++
1
2
3
4
5
6
7
//...
   throw 100;
    }
    catch(int)
    {
        cout << "int" << endl; 
    }
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 14:36     Ограничения исключительных ситуаций f(.)throw(.){} #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  [ТС]     Ограничения исключительных ситуаций f(.)throw(.){} #17
ок, подметим
Цитата Сообщение от ForEveR Посмотреть сообщение
Но MSVC на это как бы класть
, Спасибо)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
07.08.2012, 14:38     Ограничения исключительных ситуаций f(.)throw(.){} #18
Alberto_Timakov, Я бы на вашем месте проверил как у MSVC в релизе с этим дела обстоят. Вполне возможно, что в debug версии он не зовется, а в релизе зовется.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
07.08.2012, 14:51  [ТС]     Ограничения исключительных ситуаций f(.)throw(.){} #19
Цитата Сообщение от ForEveR Посмотреть сообщение
Вполне возможно, что в debug версии он не зовется, а в релизе зовется.
Если под релизом подразумевается то, что лежит в папке debug, то да, все работает, спасибо!)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2012, 14:54     Ограничения исключительных ситуаций f(.)throw(.){}
Еще ссылки по теме:

C++ Придумать 10 задач на обработку исключительных ситуаций
C++ Обработка исключительных ситуаций!
Обработка исключительных ситуаций C++

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
07.08.2012, 14:54     Ограничения исключительных ситуаций f(.)throw(.){} #20
Режим компиляции отладочный или итоговый подразумевается
Yandex
Объявления
07.08.2012, 14:54     Ограничения исключительных ситуаций f(.)throw(.){}
Ответ Создать тему
Опции темы

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