Wyjątki: przechwytywanie i usuwanie wyjątków
Poniższe instrukcje i przykłady pokazują, jak przechwytywać i usuwać wyjątki. Aby uzyskać więcej informacji na try
temat słów kluczowych , catch
i throw
, zobacz Nowoczesne najlepsze rozwiązania języka C++ dotyczące wyjątków i obsługi błędów.
Programy obsługi wyjątków muszą usuwać obsługiwane przez nie obiekty wyjątków, ponieważ błąd usunięcia wyjątku powoduje przeciek pamięci za każdym razem, gdy kod przechwytuje wyjątek.
Blok catch
musi usunąć wyjątek, gdy:
Blok
catch
zgłasza nowy wyjątek.Oczywiście nie można usunąć wyjątku, jeśli ponownie zgłosisz ten sam wyjątek:
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
Wykonanie jest zwracane z bloku
catch
.
Uwaga
Podczas CException
usuwania elementu użyj funkcji składowej Delete
, aby usunąć wyjątek. Nie używaj słowa kluczowego delete
, ponieważ może zakończyć się niepowodzeniem, jeśli wyjątek nie znajduje się na stercie.
Aby przechwycić i usunąć wyjątki
Użyj słowa kluczowego
try
try
, aby skonfigurować blok. Wykonaj wszystkie instrukcje programu, które mogą zgłaszać wyjątek wtry
bloku.Użyj słowa kluczowego
catch
catch
, aby skonfigurować blok. Umieść kod obsługi wyjątków wcatch
bloku. Kod wcatch
bloku jest wykonywany tylko wtedy, gdy kod wtry
bloku zgłasza wyjątek typu określonego w instrukcjicatch
.Poniższy szkielet pokazuje, jak
try
icatch
bloki są zwykle rozmieszczone:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CException* e) { // Handle the exception here. // "e" contains information about the exception. e->Delete(); }
Gdy zgłaszany jest wyjątek, kontrolka przechodzi do pierwszego
catch
bloku, którego deklaracja wyjątku jest zgodna z typem wyjątku. Można selektywnie obsługiwać różne typy wyjątków z blokami sekwencyjnymicatch
, jak pokazano poniżej:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CMemoryException* e) { // Handle the out-of-memory exception here. e->Delete(); } catch (CFileException* e) { // Handle the file exceptions here. e->Delete(); } catch (CException* e) { // Handle all other types of exceptions here. e->Delete(); }
Aby uzyskać więcej informacji, zobacz Wyjątki: konwertowanie z makr wyjątków MFC.