Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 21:53   #1
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию Исключения C++

Доброго времени суток уважаемые эксперты. Никак не могу разобраться, что имеется ввиду. Помогите пожалуйста.
Постановка задачи:
Напишите программу на С++, которая показывает, что важна последовательность обработчиков исключений. Выполняется первый соответствующий обработчик. Скомпилируйте и выполните вашу программу с двумя различными последовательностями обработчиков, чтобы показать, что при этом наблюдаются различные результаты.

Делаю так:
Код:
#include <QApplication>
#include <QMessageBox>
#include <stdlib.h>
#include <time.h>
void Zero();
void BoolExcept();
void FloatExcept();
void UserExcept();


class MyClass{
public:
    MyClass(){};
};



int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QString str;
    srand(time(NULL));
    while (true){
        //EXEPTION
        str.clear();
//=======================================TRY
        try {
            str += QString().fromLocal8Bit("Gen: INT - исключение");
            Zero();
        } catch (...){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение любого типа");
        }
//=======================================CATCH
//=======================================TRY
        try {
            str += QString().fromLocal8Bit("\nGen: BOOL - исключение");
            BoolExcept();
        } catch (int i){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение типа int");
        } catch(bool b){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение bool = ")+
                   QString().fromLocal8Bit(b?"true":"false");
        } catch (...){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение любого типа");
        }
//=======================================CATCH
//=======================================TRY
        try {
            str += QString().fromLocal8Bit("\nGen: BOOL - исключение");
            FloatExcept();
        } catch (int i){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение типа int");
        } catch(bool b){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение bool = ")+
                   QString().fromLocal8Bit(b?"true":"false");
        } catch (...){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение любого типа");
        }
//=======================================CATCH
//=======================================TRY
        try {
            str += QString().fromLocal8Bit("\nGen: USER - исключение");
            UserExcept();
        } catch(bool b){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение bool = ")+
                   QString().fromLocal8Bit(b?"true":"false");
        } catch (...){
            str += QString().fromLocal8Bit("\n\t-перехвачено исключение любого типа");
        }
//=======================================CATCH

        QMessageBox::information(0, "Generate exception", str);
        //Return message
        QMessageBox msgBox;
        msgBox.setText(QString().fromLocal8Bit("Повторить?"));
        msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
        msgBox.setDefaultButton(QMessageBox::Yes);
        int ret = msgBox.exec();
        if (ret == QMessageBox::No)
            break;
    }
    return app.exec();
}

void Zero()
{
    throw int(0);
}
void BoolExcept()
{
    throw bool(rand()%2);
}
void FloatExcept()
{
    throw double(0.0);
}

void UserExcept()
{
    throw MyClass();
}
Что понимать под: "важна последовательность обработчиков исключений". catch описывается в любом порядке. Два throw я написать не смогу, т.к. после первого вызова throw начинает разворачиваться стек для отката выполненных действий
"чтобы показать, что при этом наблюдаются различные результаты." - а результаты каким боком зависят от последовательности обработчиков?

Если можно с небольшими примерами или просто с объяснениями. Заранее спасибо.
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 03.03.2011, 22:43   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от Impuls1989 Посмотреть сообщение
Что понимать под: "важна последовательность обработчиков исключений". catch описывается в любом порядке.
catch хоть и описывается в любом порядке, но исключение обрабатывается в первом встретившемся catch, подходящим по типу. Например:


1.
Код:
try {
   throw 10;
}
catch(int e)
{
   printf("Excption %d",e);   // обработаем исключение здесь
}
catch(...)
{
   printf("Unknown exception");  // сюда не попадем
}
2.
Код:
try {
   throw 10;
}
catch(...)
{
   printf("Unknown exception");   // обработаем исключение здесь
}
catch(int e)
{
   printf("Excption %d",e);         // сюда не попадем и не сможем обработать 
                                           //  исключение типа int, потому что catch(...)
                                           //  ловит все типы исключений
}
counter вне форума Ответить с цитированием
Старый 04.03.2011, 00:51   #3
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
catch хоть и описывается в любом порядке, но исключение обрабатывается в первом встретившемся catch, подходящим по типу.
Аааа... В таком ключе становится понятнее. Спасибо большое за разъяснение.
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исключения в Visual C++ _Mixer_ Visual C++ 10 19.01.2011 23:12
Исключения не работают Syltan Общие вопросы по Java, Java SE, Kotlin 1 09.12.2010 09:17
Исключения yurik1982 Фриланс 9 16.02.2010 00:34
SEH исключения eracer Общие вопросы C/C++ 0 18.11.2009 20:32
Исключения Rifler Общие вопросы Delphi 5 12.11.2008 00:29