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

Ваш аккаунт

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

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

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

Использование обработки исключений

4.3K
04 сентября 2004 года
VasAlVit
33 / / 03.09.2004
Возникла следующая проблема:
MS Visual C++ поддерживает два типа обработчиков исключений:
1. Исключения в стиле C++ (try/catch)
2. Исключения WinAPI (__try/__except или __try/__finally)
Используя исключения первого типа я не могу обрабатывать такие исключения как деление на 0 и доступ к памяти по нулевому указателю.
Используя исключения второго типа не вызываются деструкторы локальных объектов.
А хотелось бы обрабатывать и исключения деления на ноль, и, при возникновении исключения, чтобы вызывались деструкторы локальных объектов.
Что мне нужно сделать?
5.7K
24 сентября 2004 года
Andrdandr
29 / / 17.09.2004
Цитата:
Originally posted by VasAlVit
Возникла следующая проблема:
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),
но ничего не выбрасывают.

8.7K
15 октября 2004 года
e3136c
9 / / 15.10.2004
конечно если программируешь на с++, то лучше использовать с++ конструкции. а деструкторы нужно вызывать в ручную в секции catch
527
15 октября 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by e3136c
конечно если программируешь на с++, то лучше использовать с++ конструкции. а деструкторы нужно вызывать в ручную в секции catch


Зачем их вызывать, если как раз в C++ exception handling они сами вызваются.

8.7K
18 октября 2004 года
e3136c
9 / / 15.10.2004
Цитата:
Originally posted by pavor

Зачем их вызывать, если как раз в C++ exception handling они сами вызваются.



Извиняюсь!:) втупил....! :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог