Использование обработки исключений
MS Visual C++ поддерживает два типа обработчиков исключений:
1. Исключения в стиле C++ (try/catch)
2. Исключения WinAPI (__try/__except или __try/__finally)
Используя исключения первого типа я не могу обрабатывать такие исключения как деление на 0 и доступ к памяти по нулевому указателю.
Используя исключения второго типа не вызываются деструкторы локальных объектов.
А хотелось бы обрабатывать и исключения деления на ноль, и, при возникновении исключения, чтобы вызывались деструкторы локальных объектов.
Что мне нужно сделать?
Возникла следующая проблема:
MS Visual C++ поддерживает два типа обработчиков исключений:
1. Исключения в стиле C++ (try/catch)
2. Исключения WinAPI (__try/__except или __try/__finally)
Используя исключения первого типа я не могу обрабатывать такие исключения как деление на 0 и доступ к памяти по нулевому указателю.
Используя исключения второго типа не вызываются деструкторы локальных объектов.
А хотелось бы обрабатывать и исключения деления на ноль, и, при возникновении исключения, чтобы вызывались деструкторы локальных объектов.
Что мне нужно сделать?
Имеет значение используешь ли ты свой или библиотечный класс. Если свой, то создай класс
class CError
{
// ... код при возникновении ошибки
}
далее объяви в своем классе объект ERROR
class foo
{
// ...
CError error;
// ...
}
внутри метода foo::division(int&,int&) например
if (divider == 0)
throw CError(/* аргументы конструктора*/);
Теперь в где-нибудь в коде
void main()
{
foo f();
try
{
foo.division(x1,x2);
}
catch (CError er)
{
// код для обработки ошибки,
// например er.showmessage()
}
Если клас не твой, а классы ошибок не знаешь, то возможен такой вариант:
try
{
// ...
}
catch(...)// ловит все иключения
{
// ...
}
однако такой вариант не есть хороший.
С API извиняй не знаком.
Зы: Вроде все так !?
А, да еще одно. Многие "старые" функции из STL, которые унаследованы от С, при ошибки изменяют значение переменной errno(например EDOM, ERANGE),
но ничего не выбрасывают.
конечно если программируешь на с++, то лучше использовать с++ конструкции. а деструкторы нужно вызывать в ручную в секции catch
Зачем их вызывать, если как раз в C++ exception handling они сами вызваются.
Зачем их вызывать, если как раз в C++ exception handling они сами вызваются.
Извиняюсь!:) втупил....! :)