Instrukcje try, throw i catch (C++)

Aby zaimplementować obsługę wyjątków w języku C++, należy użyć trythrow wyrażeń , catch i .

Najpierw użyj try bloku, aby ująć w sobie co najmniej jedną instrukcje, które mogą zgłosić wyjątek.

Wyrażenie sygnalizuje, że w bloku wystąpiły wyjątkowe warunki — często throwtry błąd. Jako operandu wyrażenia można użyć obiektu dowolnego throw typu. Obiekt ten jest zazwyczaj używany do przekazywania informacji o błędzie. W większości przypadków zaleca się użycie klasy std::exception lub jednej z klas pochodnych, które są zdefiniowane w bibliotece standardowej. Jeśli jedno z tych nie jest odpowiednie, zalecamy wyprowadzenia własnej klasy wyjątków z klasy std::exception .

Aby obsłużyć wyjątki, które mogą być zgłaszane, należy zaimplementować jeden lub więcej catch bloków bezpośrednio po try bloku. Każdy catch blok określa typ wyjątku, który może obsłużyć.

W tym przykładzie try przedstawiono blok i jego programy obsługi. Załóżmy, że program uzyskuje dane za pośrednictwem połączenia sieciowego i że dwa typy wyjątków są klasami zdefiniowanymi przez GetNetworkResource() użytkownika, które pochodzą z klasy std::exception . Zwróć uwagę, że wyjątki są przechwycane const przez odwołanie w instrukcji catch . Firma Microsoft zaleca, aby generować wyjątki przez wartość i przechwytywać przez odniesienie const.

Przykład

MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error");
   // ...
}

Uwagi

Kod po try klauzuli jest chroniona sekcją kodu. Wyrażenie throwthrow, czyli zgłasza wyjątek. Blok kodu po catch klauzuli jest programem obsługi wyjątków. Jest to procedura obsługi, która przechwytuje wyjątek zgłaszany, jeśli typy w catch wyrażeniach i są zgodne. Aby uzyskać listę reguł, które określają dopasowywanie typów w catch blokach, zobacz How Catch Blocks are Evaluated (Sposób catch Jeśli instrukcja catch określa wielokropek (...) zamiast typu, blok obsługuje catch każdy typ wyjątku. Podczas kompilowania przy użyciu opcji /EHa mogą one obejmować wyjątki strukturalne języka C oraz wyjątki asynchroniczne generowane przez system lub aplikacje, takie jak ochrona pamięci, dzielenie przez zero i naruszenia wartości zmiennoprzecinków. Ponieważ bloki są przetwarzane w programie w celu znalezienia pasującego typu, program obsługi wielokropka musi być ostatnią obsługą catch skojarzonego try bloku. Należy zachować ostrożność; nie zezwalaj programowi na kontynuowanie, chyba że blok catch wie, jak obsłużyć catch(...) określony przechwycony wyjątek. Zazwyczaj blok jest catch(...) używany do rejestrować błędy i wykonywać specjalne oczyszczanie przed zatrzymaniu wykonywania programu.

Wyrażenie, throw które nie ma operandu, ponownie zgłasza wyjątek, który jest obecnie obsługiwany. Zaleca się tę formę podczas ponownego zgłaszania wyjątku, ponieważ pozwala to zachować informacje o polimorficznym typie oryginalnego wyjątku. Takie wyrażenie powinno być używane tylko w programie obsługi lub w funkcji, która catch jest wywoływana z procedury catch obsługi. Ponownie zgłoszony obiekt wyjątku to oryginalny obiekt wyjątku, a nie kopia.

try {
   throw CSomeOtherException();
}
catch(...) {
   // Catch all exceptions - dangerous!!!
   // Respond (perhaps only partially) to the exception, then
   // re-throw to pass the exception to some other handler
   // ...
   throw;
}

Zobacz też

Najlepsze rozwiązania dotyczące wyjątków i obsługi błędów w nowoczesnym języku C++
Słowa kluczowe
Nieobsługiwane wyjątki C++
__uncaught_exception