Wyjątki: używanie makr MFC i wyjątków języka C++
W tym artykule omówiono zagadnienia dotyczące pisania kodu, który wykorzystuje zarówno makra obsługi wyjątków MFC i słów kluczowych języka C++ obsługi wyjątków.
W tym artykule omówiono następujące tematy:
Mieszanie wyjątek słów kluczowych i makra
Bloki catch bloków try wewnątrz
Mieszanie wyjątek słów kluczowych i makra
Można mieszać makra wyjątek MFC i słów kluczowych wyjątek języka C++ w tym samym programie.Jednak nie można mieszać makra MFC słów kluczowych wyjątek C++ w tym samym bloku, ponieważ makra obiektów exception automatycznie usuwać chwilą wykroczenia poza zakres, dlatego kod przy użyciu słów kluczowych obsługi wyjątków, nie.Aby uzyskać więcej informacji, zobacz artykuł wyjątki: wyjątków połowu i usuwania.
Główną różnicą między makra i słowa kluczowe jest, że te makra usuwają "automatycznie" wykrył wyjątek podczas wyjątek wykracza poza zakres.Kod przy użyciu słów kluczowych, nie; wyjątki przechwytywane w bloku catch musi być jawnie usunięty.Mieszania makra i słów kluczowych języka C++ wyjątek mogą być przyczyną przecieków pamięci, gdy obiekt wyjątku nie jest usuwane lub uszkodzenie sterty, gdy wyjątek zostanie usunięte dwa razy.
Na przykład, poniższy kod, unieważnia wskaźnik wyjątek:
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
Ten problem występuje, ponieważ e jest usuwane podczas wykonywania przechodzi obecnie "wewnętrzne" połowu bloku.Za pomocą THROW_LAST makro zamiast RZUCIĆ spowoduje, że instrukcja "zewn." połowu bloku do otrzymania prawidłowego wskaźnika:
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
Spróbuj bloki wewnątrz bloki Catch
Nie można ponownie rzucić bieżącego wyjątek od wewnątrz Spróbuj bloku, który znajduje się wewnątrz połowu bloku.W poniższym przykładzie jest nieprawidłowy:
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
Aby uzyskać więcej informacji, zobacz wyjątki: badanie zawartości wyjątek.