Wyjątki: konwertowanie z makr wyjątków MFC

To jest temat zaawansowany.

W tym artykule wyjaśniono, jak konwertować istniejący kod napisany przy użyciu makr Microsoft Foundation Class — SPRÓBUJ, połowu, RZUT, i tak dalej — użyć obsługi wyjątków słów kluczowych języka C++, Spróbuj, połowu, i throw.Tematy obejmują:

  • Zalety konwersji

  • Konwersja kodu z makrami wyjątek, aby użyć języka C++ wyjątki

Korzyści wynikające z konwersji

Prawdopodobnie nie trzeba konwertować istniejący kod, chociaż należy pamiętać o różnice między implementacjami makro w MFC w wersji 3.0 i implementacji we wcześniejszych wersjach.Te różnice i kolejnych zmian w zachowaniu kodu zostały omówione w wyjątki: zmiany w makrach wyjątek w wersji 3.0.

Główne zalety konwertowanie są następujące:

  • Aby nieco mniejszy kompiluje kod, który używa słów kluczowych języka C++ obsługi wyjątków.EXE lub.DLL.

  • Słowa kluczowe obsługi wyjątków C++ są bardziej wszechstronne: mogą obsługiwać wyjątki dowolnego typu danych, które mogą być kopiowane (int, float, char, i tak dalej), podczas gdy makra obsługi wyjątków tylko klasy CException i klasy pochodzące z niego.

Główna różnica pomiędzy makra i słowa kluczowe jest, że kodu za pomocą makr "automatycznie" powoduje usunięcie wykrył wyjątek podczas wyjątek wykracza poza zakres.Kod przy użyciu słów kluczowych, nie, więc należy jawnie usunąć wykrył wyjątek.Aby uzyskać więcej informacji, zobacz artykuł wyjątki: wyjątków połowu i usuwania.

Kolejną różnicą jest składnia.Składnia służąca do makra i słowa kluczowe różni się w trzech aspektach:

  1. Argumenty i deklaracje wyjątek:

    A połowu wywołania makro ma następującą składnię:

    CATCH (exception_class, exception_object_pointer_name)  

    Należy zauważyć, przecinek między nazwę klasy i nazwę wskaźnika obiektu.

    Zgłoszenie wyjątku dla połowu słowa kluczowego używa następującej składni:

    CATCH ( exception_type exception_name**)**

    Ta instrukcja deklaracji wyjątek wskazuje typ wyjątku połowu zablokować dojścia.

  2. Rozgraniczenie bloki catch:

    Z makrami połowu makro (z jej argumentów) rozpoczyna się pierwszy blok catch; AND_CATCH makro rozpoczyna się bloki catch kolejnych i END_CATCH makro kończy sekwencji bloki catch.

    Słowa kluczowe połowu słowa kluczowego (z jego deklaracją wyjątek) rozpoczyna się każdy blok catch.Nie ma odpowiednika na END_CATCH makra; blok catch kończy jego nawias zamykający.

  3. Wyrażenie rzut:

    Użyć makra THROW_LAST ponownie wrzucić bieżącego wyjątek.throw Słowa kluczowego, bez argumentów, ma taki sam skutek.

Konwersji

Aby przekonwertować kodu za pomocą makr użyć słów kluczowych języka C++ obsługi wyjątków

  1. Zlokalizuj wszystkie wystąpienia tego makra MFC SPRÓBUJ, połowu, AND_CATCH, END_CATCH, RZUT, i THROW_LAST.

  2. Zamień lub Usuń wszystkie wystąpienia następujące makra:

    SPRÓBUJ (go zastąpić Spróbuj)

    POŁOWU (go zastąpić połowu)

    AND_CATCH(Go zastąpić połowu)

    END_CATCH(Usuń to)

    RZUT (go zastąpić throw)

    THROW_LAST(Go zastąpić throw)

  3. Argumenty makro tak, że tworzą one deklaracje prawidłowy wyjątek.

    Na przykład zmiana

    CATCH(CException, e)
    

    do

    catch(CException* e)
    
  4. Zmodyfikuj kod bloki catch, tak aby usuwa obiekty wyjątek w razie potrzeby.Aby uzyskać więcej informacji, zobacz artykuł wyjątki: wyjątków połowu i usuwania.

Oto przykładowy kod obsługi wyjątków przy użyciu makr wyjątek MFC.Należy zauważyć, że ponieważ kod w poniższym przykładzie użyto makra, wyjątek e jest automatycznie usuwany:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

Kod w następnym przykładzie używa słów kluczowych języka C++ wyjątek, więc wyjątek musi być jawnie usunięty:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch(CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

Aby uzyskać więcej informacji, zobacz wyjątki: za pomocą makra MFC i wyjątki C++.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC