Krzysztof Mossakowski
Materiały dla studentów
 

Obsługa wyjątków

MFC
Spis treści

Obsługa wyjątków
Informacje ogólne
Stare wyjątki MFC
Konwersja ze starych wyjątków MFC do wyjątków C++

  •  Informacje ogólne

    • Historia wyjątków w MFC:

      • od wersji 1.0 były w MFC makra do obsługi wyjątków oparte na klasie CException

      • w wersji 3.0 wprowadzono wyjątki C++

    • Zaleceniem twórców MFC jest używanie wyjątków C++

      • spójne używanie możliwości języka programowania

      • nieznacznie mniejszy kod wynikowy

      • zniesienie ograniczenia zgłaszania wyłącznie wyjątków pochodzących z klasy CException

      • tylko w przypadku rozwijania istniejącej aplikacji może być uzasadnione używanie starych wyjątków w MFC

[początek strony]

  •  Stare wyjątki MFC

    • Standardowe klasy wyjątków:

      • CMemoryException, CFileException, CArchiveException, CNotSupportedException, CResourceException, CDaoException, CDBException, COleException, COleDispatchException, CUserException

    • Funkcje MFC do zgłaszania wyjątków:

      • AfxThrowArchiveException, AfxThrowFileException, AfxThrowMemoryException, AfxThrowNotSupportedException, AfxThrowResourceException, AfxThrowDAOException, AfxThrowDBException, AfxThrowOleException, AfxThrowOleDispatchException, AfxThrowUserException

      • AfxAbort
        - powoduje przerwanie pracy programu
        - wołana jest przy wystąpieniu wyjątku, który nie może zostać obsłużony

    • Makra MFC do obsługi wyjątków:

      • TRY
        - blok kodu, w którym mogą wystąpić wyjątki

      • CATCH( exception_class, exception_object_pointer_name )
        - złapanie wyjątku z bloku TRY
        - drugi parametr jest wskaźnikiem do obiektu, który zostanie utworzony (będzie dostępny tylko w bloku CATCH)
        -  jako exception_class można podać CException i sprawdzać przy pomocy funkcji IsKindOf

      • CATCH_ALL( exception_object_pointer_name )
        - wyłapanie wszystkich wyjątków z bloku TRY
        - blok musi być zakończony END_CATCH_ALL

      • AND_CATCH( exception_class, exception_object_pointer_name )
        - następujące po CATCH rozszerzenie możliwości tamtego bloku

      • AND_CATCH_ALL( exception_object_pointer_name )
        - zwykle stosowane jest CATCH dla złapania wyjątku jednego typu i AND_CATCH_ALL dla złapania reszty

      • END_CATCH
        - zakończenie bloku CATCH i AND_CATCH

      • END_CATCH_ALL
        - zakończenie bloku CATCH_ALL i AND_CATCH_ALL

      • THROW( exception_object_pointer )
        - zgłoszenie wyjątku
        - parametrem musi być wskaźnik do obiektu dziedziczącego z CException

      • THROW_LAST()
        - zgłasza obsługiwany właśnie wyjątek do zewnętrznego bloku CATCH

[początek strony]

  •  Konwersja ze starych wyjątków MFC do wyjątków C++

    • Makra MFC automatycznie usuwają obiekt wyjątku, przy wyjątkach C++ programista musi sam zadbać o jego usunięcie

    • Konwersja makr:

      • TRY --> try

      • CATCH, AND_CATCH, CATCH_ALL, AND_CATCH_ALL --> catch
        - CATCH( CException, e ) --> catch( CException *e )
        - przed wyjściem z bloku catch musi być  e->Delete()

      • THROW, THROW_LAST --> throw

      • END_CATCH, END_CATCH_ALL --> usunąć, nie mają odpowiedników

[początek strony]