Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка исключения, Использование класса исключения 
:(
    Опции темы
And234
Дата 7.12.2005, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



Среда VC6

для примера консоль.
Код

#include "stdafx.h"
#include "ClassGL.h"
#include "Exeptt.h"
int main(int argc, char* argv[])
{
    try {
        ClassGl dse;
        dse.Complite();
        printf("SUCCESS!\n");
    }
    catch(...) {
        printf("catch main!\n");
    }
    return 0;
}

и два класса
1 для обрабоки
Код

class ClassGl  
{
public:
    void Err();
    bool Complite();
    ClassGl();
    virtual ~ClassGl() ;

};
bool ClassGl::Complite()
{
    try
    {
        // почему здесь обработчик?
        // потому-что  проверяемые значения могут быть неверными
        // тогда
        Err(); // принудительно вызываем исключение на метке Д12
        return true;
    }
    catch(Exeptt)
    {
        Err();
        return false;
    }
    return true;
}

void ClassGl::Err()
{
    try {

    }
    catch(...){
        throw Exeptt("msgerr catch 1");
    }
    d12:    
    throw Exeptt("msgerr catch 2");

}


2 класс исключения

Код

class Exeptt  
{
public:
    char *GetMsg();
    Exeptt(char *perrmsg);
    virtual ~Exeptt();

protected:
    char msgerr;
};
Exeptt::Exeptt(char *perrmsg)
{
    msgerr = *perrmsg;
}

Exeptt::~Exeptt()
{

}

char *Exeptt::GetMsg()
{
    return &msgerr;  
}


компилится и работает ОК
но если обозначаю класс исключения в Main()
как
Код

    }
    catch(Exeptt *ex) {
        printf("catch main!\n");


возникает ошибка "abnormal program termination".
Как я могу исправить, с условием обработки исключения этим классом.
Думаю проблема в типах функций.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 7.12.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Где код, в котором непосредственно генерится исключение?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
blackofe
Дата 7.12.2005, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



And234
а почему не так?

Код
}
    catch(const Exeptt &ex) {
        printf("catch main! error: &s\n", ex.GetMsg());


я немножко переделал программу. мне такой вариант нравится больше:

Код
class Exeptt {
public:
    Exeptt(const char *perrmsg)            {    msgerr = strdup(perrmsg); }
    virtual ~Exeptt()                    {    delete msgerr; }

    const char *GetMsg() const            {    return msgerr; }

protected:
    char *msgerr;
};

class ClassGl {
public:
    ClassGl() {}
    virtual ~ClassGl() {}

    void Err();
    bool Complite();
};

bool ClassGl::Complite()
{
    try {
        Err();
        return true;
    } catch(const Exeptt &) {
        Err();
        return false;
    }
    return true;
}

void ClassGl::Err()
{
    try {
    } catch(...) {
        throw Exeptt("msgerr catch 1");
    }
    throw Exeptt("msgerr catch 2");
}

int main(int argc, char* argv[])
{
    try {
        ClassGl dse;
        dse.Complite();
        printf("SUCCESS!\n");
    } catch(const Exeptt &ex) {
        printf("catch main! error: %s\n", ex.GetMsg());
    }
    return 0;
}


выдает результат:

catch main! error: msgerr catch 2
Press any key to continue

Это сообщение отредактировал(а) blackofe - 7.12.2005, 18:30
PM MAIL   Вверх
And234
Дата 7.12.2005, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 22.11.2005

Репутация: нет
Всего: нет



blackofe
Огромное спасибо.
То что нужно.

Очень волнует один вопрос.
Код

virtual ~Exeptt()                    {    delete msgerr; }
Очистка обязательна?

PM MAIL ICQ   Вверх
blackofe
Дата 7.12.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Цитата(And234 @ 7.12.2005, 19:55)
Очень волнует один вопрос.
Код

virtual ~Exeptt()                    {    delete msgerr; }
Очистка обязательна?

strdup(perrmsg); аллокирует новую память, копирует туда строку perrmsg и помещает указатель на нее в msgerr. ясное дело, что за собой надо подчищать smile.

хотя, наверное, можно обойтись и без аллокации:

Код
class Exeptt {
public:
    Exeptt(char *perrmsg)            {    msgerr = perrmsg; }

    const char *GetMsg() const            {    return msgerr; }

protected:
    char *msgerr;
};


но мне этот вариант нравится меньше. не люблю, когда изнутри объекта я ссылаюсь на бог весть что. в нашем случае, когда аргументом конструктора Exeptt является константа, оно как бы нестрашно. но если передается указатель на строку, которая где-нибудь по пути удалится - это у меня вызывает не очень приятные ощущения. ;)

Это сообщение отредактировал(а) blackofe - 7.12.2005, 20:09
PM MAIL   Вверх
blackofe
Дата 7.12.2005, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



вообще я предпочитаю работать со string'ом. вот, к примеру, мой универсальный класс исключений.

Код

#define ZERROR_NOERROR                0L

class ZException {
public:
    ZException(const unsigned long Error = ZERROR_NOERROR, const string Info = "")
                : error(Error), info(Info) {}

    const unsigned long Error() const            {    return error; }
    const string &Info() const                    {    return info; }
    virtual const string Description() const = 0;

private:
    unsigned long error;
    string info;
};


когда я создаю класс, в котором могут генериться исключения, я делаю nested класс:

Код

// A errors:
#define A_E_FATALERROR                1L
#define A_E_NONFATALERROR           2L

class A {
public:
    A() {}
    virtual ~A() {}
    // ...
    void Bad()                    {    throw Exception(A_E_FATALERROR, "Something horrible in Bad()"); }
    void NotTooBad()             {    throw Exception(A_E_NONFATALERROR, "Not too much in NotTooBad()"); }

public:
    class Exception : public ZException {
    public:
        Exception(const unsigned long Error = ZERROR_NOERROR, const string Info = "")
                    : ZException(Error, Info) {}
        const string Description() const;
    };
};


мне остается только имплементировать функцию Description() и я allset.

Код

const string A::Exception::Description() const
{
    switch(Error()) {
    case A_E_FATALERROR:
        return "Fatal error";
    case A_E_NONFATALERROR:
        return "Non-fatal error";
    }
    return "Unknown Error";
}


теперь я могу ловить исключения, причем избирательно. могу как A::Exception, а могу как более общий ZException:

Код

int main(int argc, char* argv[])
{
    A a;
    try {
        a.Bad();
    } catch(const A::Exception &ex) {
        cout << "" << ex.Error() << ", " << ex.Description() << ", " << ex.Info() << endl;
    }
    try {
        a.NotTooBad();
    } catch(const ZException &zex) {
        cout << "" << zex.Error() << ", " << zex.Description() << ", " << zex.Info() << endl;
    }
    return 0;
}


Это сообщение отредактировал(а) blackofe - 7.12.2005, 20:47
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.