Instrukcje try, throw i catch (C++)
Aby zaimplementować obsługę wyjątków w języku C++, należy użyć try
wyrażeń , throw
i 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
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla