Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Упражнения. 1. Запишите блок try и оператор catch для отслеживания и обработки простого исключения.






     

    1. Запишите блок try и оператор catch для отслеживания и обработки простого исключения.

    #include < iostream.h>

    class OutOfMemory {};

    int main()

    {

    try

    {

    int *myInt = new int;

    if (myInt == 0)

    throw OutOfMemory();

    }

    catch (OutOfMemory)

    {

    cout < < " Unable to allocate memory! \n";

    }

    return 0;

    }

    2. Добавьте в исключение, полученное в упражнении 1, переменную-член и метод доступа и используйте их в блоке оператора catch.

    #include < iostream.h>

    #include < stdio.h>

    #include < string.h>

    class OutOfMemory;

    {

    public:

    OutOfMemory(char *):

    char> > GetString() { return itsString; }

    private:

    char> > itsString;

    };

    OutOfMemory:: OutOfMemory(char * theType)

    {

    itsString = new char[80];

    char warning[] = " Out Of Memory! Can't allocate room for: ";

    strncpy(itsString, warning, 60);

    strncat(itsString, theType, 19);

    }

    int main()

    {

    try

    {

    int *myInt = new int;

    if (myInt == 0)

    throw OutOfMemory(" int");

    }

    catch (OutOfMemory& t: heException)

    {

    cout < < theException.GetString();

    }

    return 0;

    }

    3. Унаследуйте новое исключение от исключения, полученного в упражнении 2. Измените блок оператора catch таким образом, чтобы в нем происходила обработка как производного, так и базового исключений.

    1: #include < iostream.h>

    2:

    3: // Абстрактный тип исключений

    4: class Exception

    5: {

    6: public:

    7: Exception(){}

    8: virtual ~Exceptiori(){}

    9: virtual void PrintError() = 0;

    10: };

    11:

    12: // Производный класс для обработки проблем памяти

    13: // Обратите внимание: в этом классе не производится выделение памяти

    14: class OutOfMemory: public Exception

    15: {

    16: public:

    17: OutOfMemory(){}

    18: ~OutOfMemory(){}

    19: virtual void PrintError();

    20: private:

    21: };

    22:

    23: void OutOfMemory:: PrintError()

    24: {

    25: cout < < " Нет памяти!! \n";

    26: }

    27:

    28: // Производный класс для обработки ввода неверных чисел

    29: class RangeError: public Exception

    30: {

    31: public:

    32: RangeError(unsigned long number){badNumber = number: }

    33: ~RangeError(){}

    34: virtual void PrintError();

    35: virtual unsigned long GetNumber() { return badNumber; }

    36: virtual void SetNumber(unsigned long number) {badNumber = number; }

    37: private:

    38: unsigned long badNumber;

    39: };

    40:

    41: void RangeError:: PrintError()

    42: {

    43: cout < < " Number out of range. You used " < < GetNumber() < < " N\n";

    44: }

    45:

    46: void MyFunction(); // прототип функции

    47:

    48: int main()

    49: {

    50: try

    51: {

    52: MyFunction();

    53: }

    54: // Чтобы использовать только один оператор catch,

    55: // примените для этого виртуальные функции

    56: catch (Exceptions theException)

    57: {

    58: theException.PrintError();

    59: }

    60: return 0;

    61: }

    62:

    63: void MyFunction()

    64: {

    65: unsigned int *myInt = new unsigned int;

    66: long testNumber;

    67: if (myInt == 0)

    68: throw 0ut0fMemory();

    69: cout < < " Enter an int: ";

    70: cin > > testNumber;

    71: // эту проверку лучше заменить серией

    72: // проверок, чтобы выявить неверные данные, введенные пользователем

    73: if (testNumber > 3768 || testNumber < 0)

    74: throw RangeError(testNumber);

    75:

    76: *mylnt = testNumber;

    77: cout < < " Ok. myInt: " < < *myInt;

    78: delete myInt;

    79: }

    4. Измените код из упражнения 3, чтобы получить трехуровневый вызов функции.

    1: #include < iostream.h>

    2:

    3: // Абстрактный тип исключений

    4: class Exception

    5: {

    6: public:;

    7: Exception(){ }

    8: virtual ~Exception(){}

    9: virtual void PrintError() = 0;

    10: };

    11:

    12: // Производный класс для обработки проблем памяти

    13: // Обратите внимание: в этом классе не производится выделение памяти!

    14: class OutOfMemory: public Exception

    15: {

    16: public:

    17: OutOfMemory(){}

    18: ~OutOfMemory(){}

    19: virtual void PrintError();

    20: private:

    21: };

    22:

    23: void OutOfMemory:: PrintError()

    24: {

    25: cout < < " Нет памяти!! \n";

    26: }

    27:

    28: // Производный класс для обработки ввода неверных чисел

    29: class RangeError: public Exception

    30: {

    31: public:

    32: RangeError(unsigned long number){badNumber = number; }

    33: ~RangeError(){ }

    34: virtual void PrintError();

    35: virtual unsigned long GetNumber() { return badNumber; }

    36: virtual void SetNumber(unsigned long number) {badNumber = number; }

    37: private:

    38: unsigned long badNumber;

    39: };

    40:

    41: void RangeError:: PrintError()

    42: {

    43: cout < < " Number out of range. You used " < < GetNumber() < < "!! \n";

    44: }

    45:

    46: // прототипы функций

    47: void MyFunction();

    46: unsigned int * FunctionTwo();

    49: void FunctionThree(unsigned int *);

    50:

    51: int main()

    52: {

    53: try

    54: {

    55: MyFunction();

    56: }

    57: // Чтобы использовать только один оператор catch,

    58: // примените для этого виртуальные функции.

    59: catch (Exception& theException)

    60: {

    61: theException.PrintError();

    62: }

    63: return 0;

    64: }

    65:

    66: unsigned int > > FunctionTwo()

    67: {

    68: unsigned int < < royInt = new unsigned int;

    69: if (myInt == 0)

    70: throw OutOfMemory();

    71: return myInt;

    72: }

    73:

    74: void MyFunction()

    75: {

    76: unsigned int *myInt = FunctionTwo{ };

    77:

    78: FunctionThree(myInt);

    79: cout < < " 0k. myInt: " < < *myInt;

    80: delete myInt;

    81: }

    82:

    83: void FunctionThree(unsigned int *ptr)

    84: {

    85: long testNumber;

    86: cout < < " Enter an int: ";

    87: cin > > testNumber;

    88: // эту проверку лучше заменить серией

    89: // проверок, чтобы выявить неверные данные, введенные пользователем

    90: if (testNumber > 3768 || testNumber < 0)

    91: throw RangeError(testNumber);

    92: *ptr = testNumber;

    93: }

    5. Жучки: что неправильно в следуюшем коде?

    #include " string.h" // класс строк

    class xOutOfMemory

    {

    public:

    xOutOfMemory(const String& where): location(where){ }

    ~xOutOfMemory(){ }

    virtual String where(){ return location };

    private:

    String location;

    }

    main()

    {

    try

    {

    char *var = new char;

    if (var == 0)

    throw xOutOfMemory();

    }

    catch(xOutOfMemory& theException)

    {

    cout < < " Out of memory at " < < theException.location() < < " \n";

    }

    }

    В процессе обработки ситуации нехватки памяти конструктором класса xOutOfMemory в области свободной памяти создается объект типа string. Это исключение может возникнуть только в том случае, когда программе не хватает памяти, поэтому попытка нового выделения памяти будет тем более неудачной.

    Возможно, что попытка создать эту строку послужит причиной возникновения такого же исключения, что приведет к образованию бесконечного цикла, который будет выполняться до тех пор, пока компьютер не зависнет. Если эта строка все же нужна, можно выделить для нее память в статическом буфере до начала работы программы, а затем использовать ее rio необходимости, т.е. при возникновении исключения.

     

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.