Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Неожиданные исключения в С++

6.7K
26 июля 2004 года
TylerDurden
20 / / 26.07.2004
Как заменить стандартную функцию обработки неожиданных исключений unexpected() своей функцией? Вот небольшая моя программа:

#include <eh.h>
#include <iostream.h>
typedef void (*PVF)();
PVF set_unexpected(PVF);
void myunexpected()
{
cout<<"unexpected error";
}
void main()
{
set_unexpected(&myunexpected);
int a =0;
a=a/a;/*по идее должна вызваться моя функция myunexpected, но
этого почему-то не происходит. Или я чего-то не понимаю?*/
}
7.1K
31 июля 2004 года
krl
11 / / 28.07.2004
Из стандарта:

15.4.11:
функция без exception-specification разрешает любые исключения.

15.4.8:
только для исключений, не разрешенных в exception-specification, вызовется unexpected.

В данном случае надо добавить throw() к описанию функции.
6.7K
01 августа 2004 года
TylerDurden
20 / / 26.07.2004
Цитата:

В данном случае надо добавить throw() к описанию функции.


Если я правильно понял, то throw() надо добавить к main:
void main() throw() {...}
Если правильно, то это не работает :( В myunexpected я так и не попал...

Цитата:

только для исключений, не разрешенных в exception-specification, вызовется unexpected.


А что вызовется для необработанного исключения, если не будет throw()?

7.1K
01 августа 2004 года
krl
11 / / 28.07.2004
Если нет throw(), функции разрешены любые исключения - она никогда не вызовет unexpected().

Насчет попадания в myunexpected():
Вы сами определяете функцию set_unexpected(), может лучше подключить стандартный <exception>?
Там же описан и тип typedef void (*unexpected_handler)(), который надо передавать в set_unexpected();
527
02 августа 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by krl
Если нет throw(), функции разрешены любые исключения - она никогда не вызовет unexpected().

Насчет попадания в myunexpected():
Вы сами определяете функцию set_unexpected(), может лучше подключить стандартный <exception>?
Там же описан и тип typedef void (*unexpected_handler)(), который надо передавать в set_unexpected();


Имя функции уже является указателем на нее и операция взятия адреса не нужна. Попробуй set_unexpected((unexpected_handler)myunexpected);

6.7K
02 августа 2004 года
TylerDurden
20 / / 26.07.2004
to krl
Я и подключаю стандартную <eh.h>... А пристутствие/отсутствие моего typedef никак не влияет на работоспособность программы.

to pavor
Исправил, но не помогло.
7.1K
02 августа 2004 года
krl
11 / / 28.07.2004
К сожалению в данный момент доступа к VC нет, но этот код в BCB все-таки выводит на экран единицу:

#include <exception>
#include <iostream>
using namespace std;

int a = 0;
void cdecl myhandler()
{
a = 1;
cout << a;
}
void main() throw()
{
set_unexpected(myhandler);
unexpected();
}

Кстати, если написать 0/0, он ни одного исключения не бросает. Проверьте, что будет, если вызвать unexpected() или throw some_class().
6.7K
03 августа 2004 года
TylerDurden
20 / / 26.07.2004
Все, всем спасибо. Проблема решилась просто:) :
The unexpected function is not used in current Microsoft C++ exception-handling implementation
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог