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

Ваш аккаунт

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

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

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

try,catcth. Отлавливаем ошибки динамической работы с памятью.

23K
25 октября 2009 года
GoldenMustang
7 / / 02.06.2007
Ребят,помогите,пожалуйста,разобраться, как отловить ошибки динамической работы с файлами:
Код:
#include <iostream>

using namespace std;

struct List
{
    List* Next;
};
List* Head=NULL;
int main()
{
    Head=new List;
    Head->Next=NULL;
    List* ptr=new List;
    Head->Next=ptr;
    ptr->Next=NULL;
    try
    {
        ptr=Head;
        while(1)
        {
            ptr=ptr->Next;
        }
    }
    catch(...)
    {
        cout<<"f";
    }
    return 0;
}


Программа завершается с ошибкой. Делаю в КодБлоксе.
602
25 октября 2009 года
KPI Student
265 / / 16.12.2006
try...catch ловит исключения С++, генерируемые с помощью throw. Ни больше ни меньше. Как вы видите, в вашем коде throw не вызывается нигде, поэтому в catch (...) выполнение никогда не попадает.

Если хотите ловить исключения, генерируемы системой, придется использовать системные сдедства: SEH/VEH под виндой, сигналы под линуксом.

Как вариант, можно написать свои поинтеры, которые по одним им известным критериям будут отслеживать свою корректность, но подумайте, стоят ли затраты на их создание пользой, от них полученной?
535
27 октября 2009 года
Нездешний
537 / / 17.01.2008
[QUOTE="KPI Student"]try...catch ловит исключения С++, генерируемые с помощью throw. Ни больше ни меньше[/QUOTE]Это не совсем так
[QUOTE="Рихтер"]...исключения С++ — часть самого языка и его компилятор автоматически создает код, который вызывает деструкторы объектов и тем самым обеспечивает корректную очистку ресурсов.

Однако Вы должны иметь в виду, что компилятор Microsoft Visual С++ реализует обработку исключений С++ на основе SEH операционной системы. Например, когда Вы создаете С++-блок try, компилятор генерирует SEH-блок _try. С++-блок catch ста новится SEH-фильтром исключений, а код блока catch — кодом SEH-блока __except. По сути, обрабатывая С++-оператор throw, компилятор генерирует вызов Windows функции RaiseException, и значение переменной, указанной в throw, передастся этой функции как дополнительный аргумент.[/QUOTE]

2 GoldenMustang
В C++ Buider ваш код работает. Так что причину, видимо, надо искать в MinGW
260
27 октября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Нездешний
Это не совсем так


2 GoldenMustang
В C++ Buider ваш код работает. Так что причину, видимо, надо искать в MinGW



Только кое что товарищ Рихтер упустил, а именно начиная от различия типа исключения бросаемого через throw и самой системой до специального ключика компилятора чтобы он ловил и системные исключения.

В общем случае системные исключения и сигналы C++'шной конструкцией try / catch не обрабатываются и зашиваться на это не следует.

54K
02 ноября 2009 года
gnom113
1 / / 02.11.2009
как используя исключения отловить ошибку ввода вывода?
602
03 ноября 2009 года
KPI Student
265 / / 16.12.2006
Цитата: gnom113
как используя исключения отловить ошибку ввода вывода?



Написать обработчик!

ЗЫ. какой вопрос - такой и ответ.

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