Sdílet prostřednictvím


Výjimky: Změny maker výjimku ve verzi 3.0

Toto je rozšířená.

Makra zpracování výjimek byly změněny v MFC verze 3.0 a pozdější použití výjimky C++.Tento článek vysvětluje, jak tyto změny mohou ovlivnit chování existující kód, který používá makra.

Tento článek obsahuje následující témata:

  • Typy výjimek a úlovku makro

  • Opětné vyvolání výjimky

Typy výjimek a úlovku makro

V dřívějších verzích MFC úlovku makro MFC typu run-time informace slouží k určení typu k výjimce; Typ výjimky je určena slovy, místě úlovku.S výjimkami C++ však typ výjimky, vždy určen na serveru throw typ objektu je vyvolána výjimka.To způsobí nekompatibility ve vzácných případech, kde typ ukazatele myši na objekt thrown se liší od typu thrown objektu.

Důsledkem tohoto rozdílu mezi MFC verze 3.0 a dřívější verze ukazuje následující příklad:

TRY
{
   THROW( (CException*) new CCustomException() );
}
CATCH( CCustomException, e )
{
   TRACE( "MFC 2.x will land here\n" );
}
AND_CATCH( CException, e )
{
   TRACE( "MFC 3.0 will land here\n" );
}
END_CATCH

Tento kód chová odlišně ve verzi 3.0 protože řízení předá vždy první úlovku bloku s odpovídající prohlášení výjimku.Výsledek výrazu throw

THROW( (CException*) new CCustomException() );

vyvolání jako CException *, i když je konstruována jako CCustomException.Úlovku makro v MFC verze 2.5 a starší používá CObject::IsKindOf test typu v době spuštění.Protože výraz

e->IsKindOf(RUNTIME_CLASS(CException));

je to první blok catch úlovky výjimku.Druhý blok catch ve verzi 3.0, který používá C++ výjimky k provádění mnoha makra zpracování výjimek, odpovídá thrown CException.

Například tento kód je běžné.Obvykle zobrazí, pokud je předána jinou funkci, která přijímá obecný objekt výjimky CException *, provádí zpracování "pre-throw" a nakonec výjimku.

Chcete-li tento problém vyřešit, přesuňte throw výraz z funkce volání kódu a vyvoláním výjimky skutečný typ kompilátor známo v době, kdy je vygenerována výjimka.

Opětné vyvolání výjimky

Bloku catch nelze vyvolat stejné výjimky ukazatel, který je zachycena.

Například tento kód platný v předchozích verzích, ale bude mít neočekávané výsledky verze 3.0:

   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH( CException, e )
   {
      THROW( e );    // Wrong. Use THROW_LAST() instead
   }
   END_CATCH
}

Pomocí VYVOLÁNÍM úlovku v bloku způsobí ukazatel e tak, aby vnější úlovku webu obdrží neplatný ukazatel odstraněn.Use THROW_LAST to re-throw e.

Další informace naleznete v výjimky: výjimky odlovy a odstraňování.

Viz také

Koncepty

Zpracování výjimek v MFC