Instrukcje try, throw i catch (C++)try, throw, and catch Statements (C++)

Aby zaimplementować obsługę wyjątków w C++programie, należy użyć wyrażeń try, throwi catch .To implement exception handling in C++, you use try, throw, and catch expressions.

Najpierw użyj bloku try , aby ująć jedną lub więcej instrukcji, które mogą zgłosić wyjątek.First, use a try block to enclose one or more statements that might throw an exception.

Wyrażenie throw sygnalizuje, że wyjątkowy warunek — często błąd — wystąpił w bloku try .A throw expression signals that an exceptional condition—often, an error—has occurred in a try block. Można użyć obiektu dowolnego typu jako operandu wyrażenia throw .You can use an object of any type as the operand of a throw expression. Obiekt ten jest zazwyczaj używany do przekazywania informacji o błędzie.Typically, this object is used to communicate information about the error. W większości przypadków zaleca się użycie klasy std:: Exception lub jednej z klas pochodnych, które są zdefiniowane w standardowej bibliotece.In most cases, we recommend that you use the std::exception class or one of the derived classes that are defined in the standard library. Jeśli jeden z tych elementów nie jest odpowiedni, zalecamy uzyskanie własnej klasy wyjątku z std::exception.If one of those is not appropriate, we recommend that you derive your own exception class from std::exception.

Aby obsłużyć wyjątki, które mogą być zgłaszane, zaimplementuj jeden lub więcej bloków catch bezpośrednio po bloku try .To handle exceptions that may be thrown, implement one or more catch blocks immediately following a try block. Każdy blok catch określa typ wyjątku, który może obsłużyć.Each catch block specifies the type of exception it can handle.

Ten przykład pokazuje blok try i jego programy obsługi.This example shows a try block and its handlers. Załóżmy, że GetNetworkResource() uzyskują dane przez połączenie sieciowe i że dwa typy wyjątków są klasami zdefiniowanymi przez użytkownika, które pochodzą z std::exception.Assume that GetNetworkResource() acquires data over a network connection and that the two exception types are user-defined classes that derive from std::exception. Należy zauważyć, że wyjątki są przechwytywane przez odwołanie const w instrukcji catch .Notice that the exceptions are caught by const reference in the catch statement. Firma Microsoft zaleca, aby generować wyjątki przez wartość i przechwytywać przez odniesienie const.We recommend that you throw exceptions by value and catch them by const reference.

PrzykładExample

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");
   // ...
}

UwagiRemarks

Kod po klauzuli try to chroniona sekcja kodu.The code after the try clause is the guarded section of code. Wyrażenie throw zgłasza— to znaczy, podnosi — wyjątek.The throw expression throws—that is, raises—an exception. Blok kodu po klauzuli catch jest programem obsługi wyjątków.The code block after the catch clause is the exception handler. Jest to procedura obsługi, która przechwytuje wyjątek zgłaszany, jeśli typy w wyrażeniach throw i catch są zgodne.This is the handler that catches the exception that's thrown if the types in the throw and catch expressions are compatible. Aby uzyskać listę reguł rządzących dopasowaniem typu w blokach catch , zobacz jak są oceniane bloki catch.For a list of rules that govern type-matching in catch blocks, see How Catch Blocks are Evaluated. Jeśli instrukcja catch określa wielokropek (...) zamiast typu, blok catch obsługuje każdy typ wyjątku.If the catch statement specifies an ellipsis (...) instead of a type, the catch block handles every type of exception. Podczas kompilowania z użyciem opcji /EHa mogą to być wyjątki strukturalne C i generowane przez system lub generowane przez aplikacje wyjątki asynchroniczne, takie jak ochrona pamięci, dzielenie przez zero i naruszenia zmiennoprzecinkowe.When you compile with the /EHa option, these can include C structured exceptions and system-generated or application-generated asynchronous exceptions such as memory protection, divide-by-zero, and floating-point violations. Ponieważ bloki catch są przetwarzane w kolejności programu w celu znalezienia zgodnego typu, program obsługi wielokropka musi być ostatnim programem obsługi dla skojarzonego bloku try .Because catch blocks are processed in program order to find a matching type, an ellipsis handler must be the last handler for the associated try block. Użyj catch(...) z zachowaniem ostrożności; nie Zezwalaj programowi na kontynuowanie, jeśli blok catch nie wie, jak obsłużyć konkretny wyjątek, który jest przechwytywany.Use catch(...) with caution; do not allow a program to continue unless the catch block knows how to handle the specific exception that is caught. Zazwyczaj blok catch(...) jest używany do rejestrowania błędów i wykonywania specjalnego oczyszczania przed zatrzymaniem wykonywania programu.Typically, a catch(...) block is used to log errors and perform special cleanup before program execution is stopped.

Wyrażenie throw , które nie ma operandu ponownie zgłasza aktualnie obsługiwany wyjątek.A throw expression that has no operand re-throws the exception currently being handled. Zaleca się tę formę podczas ponownego zgłaszania wyjątku, ponieważ pozwala to zachować informacje o polimorficznym typie oryginalnego wyjątku.We recommend this form when re-throwing the exception, because this preserves the original exception’s polymorphic type information. Takie wyrażenie powinno być używane tylko w obsłudze catch lub w funkcji, która jest wywoływana z procedury obsługi catch .Such an expression should only be used in a catch handler or in a function that's called from a catch handler. Ponownie zgłoszony obiekt wyjątku to oryginalny obiekt wyjątku, a nie kopia.The re-thrown exception object is the original exception object, not a copy.

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 takżeSee also

Nowoczesne C++ najlepsze rozwiązania dotyczące wyjątków i obsługi błędówModern C++ best practices for exceptions and error handling
Słowa kluczoweKeywords
Nieobsługiwane wyjątki języka C++Unhandled C++ Exceptions
__uncaught_exception__uncaught_exception