Sdílet prostřednictvím


Výjimky: Pomocí makra MFC a C++ výjimky

Tento článek popisuje důležité informace pro psaní kódu, který používá makra MFC zpracování výjimek a klíčových slov jazyka C++ zpracování výjimek.

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

  • Míchání výjimku klíčová slova a makra

  • Zkuste bloků uvnitř bloky catch

Míchání výjimku klíčová slova a makra

Můžete používat makra MFC výjimku a klíčových slov jazyka C++ výjimku ve stejném programu.Ale MFC makra nelze kombinovat s klíčovými slovy C++ výjimku ve stejném bloku protože makra odstranit výjimku objekty automaticky při jejich dostanou mimo rozsah, že kód pomocí klíčových slov zpracování výjimek není.Další informace naleznete v článku výjimky: výjimky odlovy a odstraňování.

Hlavní rozdíl mezi maker a klíčová slova je, že makra "automaticky" odstranit zachytil výjimku při výjimku dostane mimo rozsah.Kód pomocí klíčových slov není; výjimky zachycené v bloku catch musí být explicitně odstraněny.Míchání makra a klíčových slov jazyka C++ výjimku můžete způsobit nevracení paměti při odstraněn objekt výjimky nebo poškození haldy po odstranění dvakrát výjimku.

Následující kód například zruší platnost výjimky ukazatele:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      throw;  // Invalid attempt to throw exception
            // to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is invalid because
    // it was deleted in the inner catch block.
}
END_CATCH

K problému dochází, protože e je odstraněna při spuštění prochází z "vnitřní" úlovku bloku.Pomocí THROW_LAST makro místo VYVOLÁNÍM způsobí, že příkaz "vnější" úlovku bloku příjem platný ukazatel:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      THROW_LAST(); // Throw exception to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is valid because
    // THROW_LAST() was used.
}
END_CATCH

Zkuste bloky Catch uvnitř bloků

Nelze opětné vyvolání výjimky aktuální v rámci akci uvnitř bloku úlovku bloku.Následující příklad je neplatný:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   try
   {
      throw;  // Wrong.  Causes e (the exception 
            // being thrown) to be deleted.
   }
   catch(CException* exception)
   {
      exception->ReportError();
   }
}
END_CATCH

Další informace naleznete v výjimky: obsah zkoumání výjimku.

Viz také

Koncepty

Zpracování výjimek v MFC