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

Aby zaimplementować obsługę wyjątków w języku C++, należy użyć spróbuj, throw, i catch wyrażenia.To implement exception handling in C++, you use try, throw, and catch expressions.

Najpierw za pomocą spróbuj blok należy 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.

A throw wyrażenie informuje, że wyjątkowy warunek — zazwyczaj błąd — wystąpił w spróbuj bloku.A throw expression signals that an exceptional condition—often, an error—has occurred in a try block. Można użyć dowolnego typu obiektu jako operandu throw wyrażenia.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ę, że używasz std::exception klasy lub jednej z klas pochodnych, które są zdefiniowane w bibliotece standardowej.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 nich nie jest właściwa, firma Microsoft zaleca wyprowadzenie własne 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ć generowane, zaimplementuj jeden lub więcej catch bloki natychmiast po spróbuj bloku.To handle exceptions that may be thrown, implement one or more catch blocks immediately following a try block. Każdy catch bloku określa typ wyjątku może obsługiwać.Each catch block specifies the type of exception it can handle.

W tym przykładzie spróbuj bloku i jego obsługę.This example shows a try block and its handlers. Przyjęto założenie, że GetNetworkResource() uzyskuje dane poprzez połączenie sieciowe i że dwa typy wyjątków to klasy zdefiniowane przez użytkownika, które wynikają 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 const odwoływać w catch instrukcji.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 spróbuj klauzula jest zabezpieczona sekcja kodu.The code after the try clause is the guarded section of code. Throw wyrażenie zgłasza— czyli generuje — wyjątek.The throw expression throws—that is, raises—an exception. Blok kodu po catch klauzula jest program obsługi wyjątków.The code block after the catch clause is the exception handler. To jest program obsługi, przechwytuje wyjątek, który jest generowany, jeśli typy w throw i catch wyrażenia 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ł, które określają dopasowanie typu w catch bloków, zobacz jak Catch Blocks are Evaluated.For a list of rules that govern type-matching in catch blocks, see How Catch Blocks are Evaluated. Jeśli catch Instrukcja określa wielokropek (...), a nie typ, catch blok 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 kompilacji z /eha opcji należą wyjątki strukturalne C oraz wyjątki asynchroniczne generowanych przez system lub wygenerowane w aplikacji takich jak pamięci ochrony, dzielenie przez zero i zmiennoprzecinkowych naruszeń .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ż catch bloki są przetwarzane w kolejności programu w celu znalezienia pasującego typu, kod obsługi wielokropka musi być ostatnim kodem obsługi skojarzonego spróbuj bloku.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 ostrożnością; nie Zezwalaj programowi na kontynuację, chyba że blok catch wie, jak obsłużyć określony wyjątek, który zostanie przechwycony.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 catch(...) blok jest używany do rejestrowania błędów i wykonywania specjalnej operacji czyszczenia, zanim wykonywanie programu zostanie zatrzymane.Typically, a catch(...) block is used to log errors and perform special cleanup before program execution is stopped.

A throw wyrażenie, które ma nie 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 można używać tylko w catch obsługi lub w funkcji, która jest wywoływana z catch programu obsługi.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

Obsługa wyjątków języka C++C++ Exception Handling
Słowa kluczoweKeywords
Nieobsługiwane wyjątki języka C++Unhandled C++ Exceptions
__uncaught_exception__uncaught_exception