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

      AfxMessageBox(strFormatted);

   }

   else

   {

      // файл открыт

      //

      // код обработки файла

      fileInput.Close();

   }

Размещение блока catchПрограммный блок catch не обязательно должен располагаться в той же функции, в которой генерируется исключение. Когда исключение выброшено, система начинает просматривать стек вызова функций в поиске адреса ближайшего блока catch. Если блок catch не найден в функции, вызвавшей исключение, система продолжает поиск блока в функции, вызвавшей эту функцию. Поиск будет продолжаться до тех пор, пока не будет исчерпан стек вызовов функций. Если при этом не будет найден блок обработки исключений, выполнение программы прекратится. Ниже приведен текст короткой программы, демонстрирующей этот механизм.

В этой программе исключение возбуждается в функции AllocateBuffer(), а перехватывается в функции main(), вызвавшей функцию AllocateBuffer().

#include <iostream.h>

class MyException

{

protected:

    char* m_msg;

public:

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

    ~MyException(){}

    char* GetError() {return m_msg;}

};

class BigObject

{

private:

     int* intarray;

public:

     BigObject() {intarray = new int[1000];}

     ~BigObject() {delete intarray;}

};

int* AllocateBuffer();

int main()

{

    int* buffer;

    try

    {

        buffer = AllocateBuffer();

        delete buffer;

    }

    catch (MyException* exception)

    {

        char* msg = exception->GetError();

        cout << msg << endl;

    }

    return 0;

}

int* AllocateBuffer()

{

    BigObject bigarray;

    float* floatarray = new float[1000];

    int* buffer = new int[256];

    if (buffer == NULL)

    {

        MyException* exception =

            new MyException("Memory allocation failed!");

        throw exception;

    }