C++ за 21 день седьмое издание



Download 1,38 Mb.
bet418/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   414   415   416   417   418   419   420   421   ...   437
Bog'liq
word1

5:

StructA()

{cout

«

"Constructed a struct A" «

endl;

}

6:

~StructA()

{cout

«

"Destroyed a struct A" «

endl;

}

  • };

    8 :





    1. struct StructB



    10: {

    1. StructB() {cout « "Constructed a struct B" « endl; }




    1. ~StructB() {cout « "Destroyed a struct B" « endl; }




    1. };



    14:


    15: void FuncB() // передача

    614 ЗАНЯТИЕ 28. Обработка исключений





    1. {




    1. cout « "In Func В" « endl;




    1. StructA objA;

    2. StructB objB;

    3. cout « "About to throw up!" « endl;




    1. throw "Throwing for the heck of it";




    1. }

    23



    1. void FuncAO




    1. {

    2. try

    3. {

    4. cout « "In Func A" « endl;




    1. StructA objA;

    2. StructB objB;

    3. FuncB();

    4. cout « "FuncA: returning to caller" « endl;

    5. }

    6. catch(const char* exp)




    1. {

      36

      cout

      «

      "FuncA: Caught exception, it says: " « exp « endl;

      37

      cout

      «

      "FuncA: Handled it here, will not throw to caller"







      «

      endl;

    2. // throw; // снимите комментирий для передачи в main ()

    3. }

    4. }

    41

    1. int main ()




    1. {

    2. cout « "main(): Started execution" « endl;




    1. try

    46



    1. FuncA();




    1. }

    2. catch(const char* exp)




    1. {

    51 cout « "Exception: " « exp « endl;



    1. }

    2. cout « "main(): exiting gracefully" « endl;




    1. return 0;

    55


    Результат


    main(): Started execution


    In Func A


    Constructed a struct A


    Constructed a struct В


    In Func В


    Constructed a struct A


    Constructed a struct В


    About to throw up!


    Destroyed a struct В

    Как действует обработка исключений

    615



    Destroyed a struct А


    Destroyed a struct В


    Destroyed a struct А


    FuncA: Caught exception, it says: Throwing for the heck of it


    FuncA: Handled it here, will not throw to caller


    main(): exiting gracefully


    Анализ

    В листинге 28.4 функция m a in () вызывает функцию F u n cA (), которая вызывает функ­


    цию F u n c B (), передающую исключение в строке 21. Обе вызывающие функции, F u n ­ c A ( ) и m a in (), являются устойчивыми к исключениям, поскольку у обеих реализован блок c a t c h ( c o n s t c h a r * ). У функции F u n c B (), передающей исключение, нет блоков


    c a t c h (), а следовательно, первым обработчиком переданного ей исключения будет блок c a t c h в пределах функции F u n cA () (строки 34-39), поскольку функция F u n cA () является


    вызывающей стороной для функции F u n c B ( ) . Обратите внимание: функция F u n c A ( ) ре­ шает, что Это исключение не имеет серьезного характера, и не передает его дальше функ­ ции m a in (). Следовательно, функция m a in () продолжит свою работу, как будто никакой проблемы нет. Если снять комментарий со строки 38, исключение будет передаваться вы­ зывающей стороне, т.е. функция m a in () также получит его.


    Вывод демонстрирует также порядок создания объектов (тот же порядок, в котором они расположены в коде) и их уничтожения при передаче исключения (обратный порядку создания объектов). Это происходит не только в функции F u n c B ( ) , где было передано исключение, но также и в функции F u n c A ( ) , которая вызвала функцию F u n c B ( ) и об­ работала исключение.





    ВНИМАНИЕ!
    В листинге 28.4 показан порядок вызова деструкторов локальных объектов при

    передаче исключения.


    Если деструктор объекта, вызванный в связи с исключением, также передал ис­


    ключение, то это приведет к аварийному завершению вашего приложения.





    Класс std :: exception

    При обработке исключения s t d : : b a d _ a llo c в листинге 28.2 вы фактически обрабаты­


    вали объект класса s t d : : b a d _ a llo c , переданный оператором new. Класс s t d : : b a d _ a l-


    l o c происходит от стандартного класса C++ s t d : : e x c e p t io n , объявленного в заголовке




    < e x c e p tio n > .






    Класс s t d : : e x c e p t io n является базовым для следующих классов важных исключений.



    b a d a l l o c . Передается при неудаче резервирования памяти оператором new.



    b a d _ c a s t . Передается оператором d y n a m ic _ c a s t при попытке приведения неправиль­




    ного типа (типа без отношений наследования).



    io s _ b a s e :: f a i l u r e . Передается функциями и методами библиотеки io s t r e a m .

    Класс s t d : : e x c e p t io n является базовым классом, предоставляющ им очень полез­ ный и важный виртуальный метод, w h a t ( ) , возвращающий более описательную инфор­ мацию о причине и природе проблемы, вызвавшей исключение. Функция e x p . w h a t ()



    616 ЗАНЯТИЕ 28. Обработка исключений

    в строке 18 листинга 28.2 предоставляет информацию “b a d a l l o c a t i o n ”, сообщая о том, что резервирование памяти потерпело неудачу. Вы можете использовать класс


    s t d : : e x c e p tio n , являющийся базовым классом для многих типов исключений, и соз­ дать еще один, c a tc h ( c o n s t e x c e p t io n s ) 4, способный обрабатывать все исключения, для которых класс s t d : : e x c e p tio n является базовым:





    Download 1,38 Mb.

    Do'stlaringiz bilan baham:
  • 1   ...   414   415   416   417   418   419   420   421   ...   437




    Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
    ma'muriyatiga murojaat qiling

    kiriting | ro'yxatdan o'tish
        Bosh sahifa
    юртда тантана
    Боғда битган
    Бугун юртда
    Эшитганлар жилманглар
    Эшитмадим деманглар
    битган бодомлар
    Yangiariq tumani
    qitish marakazi
    Raqamli texnologiyalar
    ilishida muhokamadan
    tasdiqqa tavsiya
    tavsiya etilgan
    iqtisodiyot kafedrasi
    steiermarkischen landesregierung
    asarlaringizni yuboring
    o'zingizning asarlaringizni
    Iltimos faqat
    faqat o'zingizning
    steierm rkischen
    landesregierung fachabteilung
    rkischen landesregierung
    hamshira loyihasi
    loyihasi mavsum
    faolyatining oqibatlari
    asosiy adabiyotlar
    fakulteti ahborot
    ahborot havfsizligi
    havfsizligi kafedrasi
    fanidan bo’yicha
    fakulteti iqtisodiyot
    boshqaruv fakulteti
    chiqarishda boshqaruv
    ishlab chiqarishda
    iqtisodiyot fakultet
    multiservis tarmoqlari
    fanidan asosiy
    Uzbek fanidan
    mavzulari potok
    asosidagi multiservis
    'aliyyil a'ziym
    billahil 'aliyyil
    illaa billahil
    quvvata illaa
    falah' deganida
    Kompyuter savodxonligi
    bo’yicha mustaqil
    'alal falah'
    Hayya 'alal
    'alas soloh
    Hayya 'alas
    mavsum boyicha


    yuklab olish