Неожиданные исключения в С++
#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, но
этого почему-то не происходит. Или я чего-то не понимаю?*/
}
15.4.11:
функция без exception-specification разрешает любые исключения.
15.4.8:
только для исключений, не разрешенных в exception-specification, вызовется unexpected.
В данном случае надо добавить throw() к описанию функции.
Цитата:
В данном случае надо добавить throw() к описанию функции.
Если я правильно понял, то throw() надо добавить к main:
void main() throw() {...}
Если правильно, то это не работает :( В myunexpected я так и не попал...
Цитата:
только для исключений, не разрешенных в exception-specification, вызовется unexpected.
А что вызовется для необработанного исключения, если не будет throw()?
Насчет попадания в myunexpected():
Вы сами определяете функцию set_unexpected(), может лучше подключить стандартный <exception>?
Там же описан и тип typedef void (*unexpected_handler)(), который надо передавать в set_unexpected();
Цитата:
Originally posted by krl
Если нет throw(), функции разрешены любые исключения - она никогда не вызовет unexpected().
Насчет попадания в myunexpected():
Вы сами определяете функцию set_unexpected(), может лучше подключить стандартный <exception>?
Там же описан и тип typedef void (*unexpected_handler)(), который надо передавать в set_unexpected();
Если нет throw(), функции разрешены любые исключения - она никогда не вызовет unexpected().
Насчет попадания в myunexpected():
Вы сами определяете функцию set_unexpected(), может лучше подключить стандартный <exception>?
Там же описан и тип typedef void (*unexpected_handler)(), который надо передавать в set_unexpected();
Имя функции уже является указателем на нее и операция взятия адреса не нужна. Попробуй set_unexpected((unexpected_handler)myunexpected);
Я и подключаю стандартную <eh.h>... А пристутствие/отсутствие моего typedef никак не влияет на работоспособность программы.
to pavor
Исправил, но не помогло.
#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().
The unexpected function is not used in current Microsoft C++ exception-handling implementation