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.