Sdílet prostřednictvím


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.

Viz také

Koncepty

Zpracování výjimek v prostředí MFC