Výjimky: Použití výjimek v makrech MFC a jazyce C++
Tento článek popisuje důležité informace o psaní kódu, který používá knihovnu MFC makra zpracování výjimek a klíčová slova zpracování výjimek C++.
Tento článek obsahuje následující témata:
Směšovací výjimky klíčová slova a makra
Uvnitř bloky catch bloky try
Směšovací výjimky klíčová slova a makra
Můžete míchat výjimky maker knihovny MFC a klíčových slovech jazyka C++ výjimky ve stejném programu.Ale MFC makra nelze kombinovat s klíčovými slovy výjimky C++ ve stejném komplexu protože makra odstraní objekty výjimek automaticky při přesahují rozsah platnosti, že nemá kód pomocí klíčových slov zpracování výjimek.Další informace naleznete v článku výjimky: zachycení a odstranění výjimky.
Hlavní rozdíl mezi makra a klíčových slov je, že makra "automaticky" odstranit Zachycenou výjimku při výjimky 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 slovech jazyka C++ výjimky může způsobit nevracení paměti, pokud není odstraněn objekt výjimky nebo poškození haldy výjimku při odstranění dvakrát.
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 k odstranění při spuštění prochází z "vnitřní" ve SKUTEČNÉ blok.Použití THROW_LAST makra namísto VYVOLAT příkaz způsobí "vnější" SKUTEČNÉ blok k obdržení ukazatele platné:
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
Uvnitř bloky Catch bloky try
Nelze znovu vyvolání aktuální výjimku ze akci blok, který je uvnitř ve SKUTEČNÉ blok.V následujícím příkladu 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 tématu výjimky: přezkoumání výjimek obsah.