try-finally
Instrukcja
Instrukcja try-finally
jest rozszerzeniem specyficznym dla firmy Microsoft, które obsługuje obsługę wyjątków strukturalnych w językach C i C++.
Składnia
Następująca składnia opisuje instrukcję try-finally
:
// . . .
__try {
// guarded code
}
__finally {
// termination code
}
// . . .
Gramatyka
try-finally-statement
:
__try
compound-statement
__finally
compound-statement
Instrukcja try-finally
to rozszerzenie firmy Microsoft do języków C i C++, które umożliwia aplikacjom docelowym zagwarantowanie wykonania kodu oczyszczania w przypadku przerwania wykonywania bloku kodu. Oczyszczanie składa się z takich zadań jak cofnięcie przydziału pamięci, zamykanie plików i zwalnianie dojść do plików. Instrukcja try-finally
jest szczególnie przydatna w przypadku procedur, które mają kilka miejsc, w których jest wykonywane sprawdzanie pod kątem błędu, który może spowodować przedwczesny powrót z procedury.
Aby uzyskać powiązane informacje i przykładowy kod, zobacz try-except
Instrukcja. Aby uzyskać więcej informacji na temat ogólnej obsługi wyjątków strukturalnych, zobacz Obsługa wyjątków strukturalnych. Aby uzyskać więcej informacji na temat obsługi wyjątków w aplikacjach zarządzanych za pomocą języka C++/CLI, zobacz Obsługa wyjątków w obszarze /clr
.
Uwaga
Strukturalna obsługa wyjątków działa z Win32 dla plików źródłowych C i C++. Jednakże nie jest specjalnie zaprojektowana dla języka C++. Można zapewnić, że kod będzie bardziej przenośny przy użyciu obsługi wyjątków C++. Ponadto, obsługa wyjątków C++ jest bardziej elastyczna, gdyż może obsługiwać wyjątki dowolnego typu. W przypadku programów języka C++ zaleca się użycie mechanizmu obsługi wyjątków języka C++ (try
, catch
, i throw
instrukcji).
Instrukcja złożone po klauzuli __try
jest sekcją chronioną. Instrukcja compound po klauzuli __finally
jest procedurą obsługi zakończenia. Procedura obsługi określa zestaw akcji wykonywanych po zakończeniu chronionej sekcji, niezależnie od tego, czy kończy chronioną sekcję przez wyjątek (nieprawidłowe zakończenie), czy według standardowego przejścia (normalne zakończenie).
Kontrolka osiąga instrukcję __try
przez proste sekwencyjne wykonanie (przechylić). Gdy kontrolka __try
wprowadza element , skojarzona z nią procedura obsługi staje się aktywna. Jeśli przepływ sterowania osiągnie koniec bloku try, wykonanie będzie kontynuowane w następujący sposób:
Wywoływana jest procedura obsługi zakończenia.
Po zakończeniu procedury obsługi zakończenia wykonywanie będzie kontynuowane po instrukcji
__finally
. Jednak chroniona sekcja kończy się (na przykład za pośrednictwemgoto
poza chronioną treścią lub instrukcjąreturn
), procedura obsługi zakończenia jest wykonywana przed przejściem przepływu sterowania z chronionej sekcji.Instrukcja
__finally
nie blokuje wyszukiwania odpowiedniego programu obsługi wyjątków.
Jeśli w __try
bloku wystąpi wyjątek, system operacyjny musi znaleźć procedurę obsługi dla wyjątku lub program zakończy się niepowodzeniem. Jeśli program obsługi zostanie znaleziony, wszystkie __finally
bloki zostaną wykonane, a wykonanie zostanie wznowione w procedurze obsługi.
Załóżmy na przykład, że seria wywołań funkcji łączy funkcję A do funkcji D, jak pokazano na poniższej ilustracji. Każda funkcja ma jedną procedurę obsługi zakończenia. Jeśli wyjątek jest zgłaszany w funkcji D i obsługiwany w A, programy obsługi zakończenia są wywoływane w tej kolejności, ponieważ system odwija stos: D, C, B.
Diagram rozpoczyna się od funkcji A, która wywołuje funkcję B, która wywołuje funkcję C, która wywołuje funkcję D. Function D zgłasza wyjątek. Programy obsługi zakończenia są następnie wywoływane w następującej kolejności: procedura obsługi zakończenia D, a następnie C, B, a następnie A obsługuje wyjątek.
Kolejność wykonywania programu obsługi zakończenia
Uwaga
Zachowanie funkcji try-finally różni się od innych języków, które obsługują korzystanie finally
z programu , takiego jak C#. Pojedynczy __try
element może mieć wartość , ale nie zarówno z , jak __finally
i __except
. Jeśli oba mają być używane razem, zewnętrzna instrukcja try-except musi ująć wewnętrzną instrukcję try-finally. Reguły określające, kiedy poszczególne bloki są również inne.
Aby uzyskać zgodność z poprzednimi wersjami, _try
, , i _leave
są synonimami dla __try
, __finally
i __leave
chyba że określono opcję/Za
kompilatora (Wyłącz rozszerzenia języka)._finally
Słowo kluczowe __leave
Słowo __leave
kluczowe jest prawidłowe tylko w chronionej sekcji try-finally
instrukcji, a jej efektem jest przejście na koniec chronionej sekcji. Wykonanie jest kontynuowane w pierwszej instrukcji w procedurze obsługi zakończenia.
Instrukcja goto
może również wyskoczyć z chronionej sekcji, ale obniża wydajność, ponieważ wywołuje odwijanie stosu. Instrukcja __leave
jest wydajniejsza, ponieważ nie powoduje odwijania stosu.
Nieprawidłowe zakończenie
try-finally
Zakończenie instrukcji przy użyciu funkcji longjmp czasu wykonywania jest uznawane za nieprawidłowe zakończenie. To nie jest legalne, aby wskoczyć do __try
oświadczenia, ale to legalne, aby wyskoczyć z jednego. Wszystkie __finally
instrukcje aktywne między punktem odlotu (normalne zakończenie __try
bloku) i miejscem docelowym ( __except
blok obsługujący wyjątek) muszą być uruchomione. Nazywa się to lokalnym unwind.
__try
Jeśli blok zostanie przedwcześnie zakończony z jakiegokolwiek powodu, w tym wyskakujący z bloku, system wykonuje skojarzony __finally
blok w ramach procesu odwijania stosu. W takich przypadkach AbnormalTermination
funkcja zwraca true
wartość , jeśli zostanie wywołana z bloku __finally
; w przeciwnym razie zwraca wartość false
.
Procedura obsługi zakończenia nie jest wywoływana, jeśli proces zostanie zabity w trakcie wykonywania try-finally
instrukcji.
KONIEC specyficzny dla firmy Microsoft
Zobacz też
Pisanie procedury obsługi kończenia
Obsługa wyjątków strukturalnych (C/C++)
Słowa kluczowe
Składnia procedury obsługi zakończenia
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