Instrukcje try, throw i catch (C++)

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

Najpierw użyj try bloku, aby ująć co najmniej jedną instrukcję, która może zgłosić wyjątek.

Wyrażenie throw sygnalizuje, że w bloku wystąpił try wyjątkowy warunek — często błąd. Można użyć obiektu dowolnego typu jako operandu throw wyrażenia. Obiekt ten jest zazwyczaj używany do przekazywania informacji o błędzie. W większości przypadków zalecamy użycie std::exception klasy lub jednej z klas pochodnych zdefiniowanych w bibliotece standardowej. Jeśli jedna z nich nie jest odpowiednia, zalecamy uzyskanie własnej klasy wyjątku z klasy std::exception.

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

W tym przykładzie pokazano try blok i jego programy obsługi. Załóżmy, że GetNetworkResource() pobiera dane za pośrednictwem połączenia sieciowego i że dwa typy wyjątków są klasami zdefiniowanymi przez użytkownika, które pochodzą z klasy std::exception. Zwróć uwagę, że wyjątki są przechwytywane przez const 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 klauzuli try jest chronioną sekcją kodu. Wyrażenie throw zgłasza wyjątek , czyli zgłasza wyjątek. Blok kodu po klauzuli jest procedurą catch obsługi wyjątków. Jest to procedura obsługi, która przechwytuje wyjątek zgłaszany, jeśli typy w wyrażeniach throw i catch są zgodne. Aby uzyskać listę reguł, które regulują dopasowywanie typów w catch blokach, zobacz How Catch Blocks are Evaluated (Jak są oceniane bloki catch). catch Jeśli instrukcja określa wielokropek (...) zamiast typu, catch blok obsługuje każdy typ wyjątku. Podczas kompilowania z opcją /EHa mogą one obejmować wyjątki strukturalne języka C oraz wyjątki generowane przez system lub wyjątki asynchroniczne generowane przez aplikację, takie jak ochrona pamięci, naruszenia podziału przez zero i zmiennoprzecinkowe. Ponieważ catch bloki są przetwarzane w programie w celu znalezienia pasującego typu, procedura obsługi wielokropka musi być ostatnią procedurą obsługi skojarzonego try bloku. Używaj catch(...) z ostrożnością; nie zezwalaj programowi na kontynuowanie, chyba że blok catch wie, jak obsłużyć określony wyjątek, który jest przechwycony. Zazwyczaj blok jest używany do rejestrowania catch(...) błędów i przeprowadzania specjalnego oczyszczania przed zatrzymanie wykonywania programu.

Wyrażenie throw , które nie zawiera argumentu operand, przywraca obecnie obsługiwany wyjątek. Zalecamy ten formularz podczas ponownego dodawania wyjątku, ponieważ zachowuje informacje o typie polimorficznym oryginalnego wyjątku. Takie wyrażenie powinno być używane tylko w catch programie obsługi lub w funkcji wywoływanej catch z programu obsługi. Obiekt wyjątku ponownegorown jest oryginalnym obiektem wyjątku, a nie kopią.

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ż

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