Программирование в среде Windows, обработка исключительных ситуаций, страница 7

Когда вы запустите программу, на экран будет предложено ввести любое число 4 до 8, за исключением 6. Если вы введете число, меньшее 4, программа выбросит исключение MyException; если вы введете число, большее 8, программа выбросит исключение chaг*; и, Наконец, если вы введете число 6, программа выбросит исключение целочисленного типа, значение которого равно введенному числу.

Хотя все исключения выбрасываются из функции GetValue(), перехват их производится в функции  main(). Блок try в функции main() связан с тремя блоками catch. Первый блок перехватывает объект MyException, второй блок перехватывает объект char*, а третий перехватывает любое другое исключение.

Как и в случае с конструкцией if-else, порядок размещения блоков catch оказывает существенное влияние на работу программы. Блоки catch, обрабатывающие конкретные типы объектов, всегда должны размещаться первыми. Если бы в примере блок catch(...) был первым, никакой другой из блоков никогда бы не вы­полнялся. Причина в том, что блок catch(...) является самым общим из всех возмож­ных и перехватывает исключение любого типа. В данном случае (как и в большинстве прочих случаев) блок catch(...) используется только для перехвата исключений, кото­рые не были перехвачены остальными блоками catch.

#include <iostream.h>

class MyException

{

protected:

    char* m_msg;

public:

    MyException(char *msg) { m_msg = msg;}

    ~MyException(){}

    char* GetError() {return m_msg;}

};

int GetValue();

int main()

{

    try

    {

        int value = GetValue();

        cout << "The value you entered is Ok." << endl;

    }

    catch(MyException* exception)

    {

        char* msg = exception->GetError();

        cout << msg << endl;

    }

    catch(char* msg)

    {

        cout << msg << endl;

    }

    catch(...)

    {

        cout << "Caught unknown exception!" << endl;

    }

    return 0;

}

int GetValue(){

    int value;