Udostępnij za pośrednictwem


Wyjątki: Konwersja z makr wyjątek MFC

Jest to temat zaawansowany.

W tym artykule wyjaśniono, jak przekonwertować istniejący kod napisany przy użyciu makr Microsoft Foundation klasy — SPRÓBUJ, połowu, THROWi tak dalej — Aby użyć słowa kluczowe obsługi wyjątków C++ Spróbuj, połowu, i throw.Tematy obejmują:

  • Zalety konwersji

  • Konwersja kodu makra wyjątek, aby użyć wyjątki C++

Korzyści wynikające z konwersji

Prawdopodobnie nie trzeba przekonwertować istniejący kod, chociaż powinny być znane różnice między implementacjami makr w wersji 3.0 MFC i implementacji we wcześniejszych wersjach.Te różnice i kolejnych zmian w zachowaniu kodu zostały omówione w wyjątki: zmienia się na wyjątek makr w wersji 3.0.

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

  • Kompiluje kod wykorzystujący słowa kluczowe obsługi wyjątków C++ do nieco mniejszy.EXE lub.DLL.

  • Słowa kluczowe obsługi wyjątków C++ są bardziej uniwersalne: one może obsłużyć wyjątki dowolnego typu danych, który można skopiować (int, pływaka, chari tak dalej), natomiast makra obsługi wyjątków tylko klasy CException i klas pochodnych.

Główna różnica pomiędzy makra i słowa kluczowe jest kod "automatycznie" przy użyciu makr usuwa wykrył wyjątek, gdy wyjątek wykracza poza zakres.Kod przy użyciu słów kluczowych nie tak musi jawnie usunąć wykrył wyjątek.Aby uzyskać więcej informacji, zobacz artykuł wyjątki: połowu i usuwanie wyjątki.

Inna różnica jest składnia.Składnia 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)

    Zawiadomienie przecinek między nazwę klasy i nazwa obiektu wskaźnika.

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

    catch (exception_typeexception_name)

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

  2. Rozgraniczenie bloki catch:

    Makra 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.

    Za pomocą słów kluczowych połowu słowa kluczowego (z jego deklaracją wyjątek) rozpoczyna się każdego bloku catch.Nie ma odpowiednika na END_CATCH makro; blok catch kończy jego nawias zamykający.

  3. Wyrażenie rzut:

    Użyć makra THROW_LAST na ponowne bieżącego wyjątek.throw Słowa kluczowego, brak argumentu jest taki sam efekt.

Wykonanie konwersji

Aby przekonwertować kodu za pomocą makra, aby użyć słowa kluczowe obsługi wyjątków C++

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

  2. Zamienianie lub usuwanie wszystkich wystąpień następujące makra:

    SPRÓBUJ (zastąpienie go z Spróbuj)

    POŁOWU (zastąpienie go z połowu)

    AND_CATCH(Zastąpienie go z połowu)

    END_CATCH(Usunąć ją)

    RZUT (zastąpienie go z throw)

    THROW_LAST(Zastąpienie go z throw)

  3. Modyfikować argumenty makra, tak aby deklaracje prawidłowy wyjątek.

    Na przykład zmiana

    CATCH(CException, e)
    

    Aby

    catch(CException* e)
    
  4. Tak, aby go usuwa obiekty wyjątku, w razie potrzeby, należy zmodyfikować kod w blokach catch.Aby uzyskać więcej informacji, zobacz artykuł wyjątki: połowu i usuwanie wyjątki.

Oto przykład kodu obsługi wyjątków, przy użyciu makra wyjątek MFC.Należy zauważyć, że ponieważ kod w poniższym przykładzie używa makr, 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, wyjątek musi 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: przy użyciu makra MFC i wyjątki C++.

Zobacz też

Koncepcje

Obsługa wyjątków w MFC