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 __trywprowadza 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:

  1. Wywoływana jest procedura obsługi zakończenia.

  2. 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średnictwem goto 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 of the order of termination handler execution.

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 finallyz 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, __finallyi __leave chyba że określono opcję/Zakompilatora (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