Udostępnij za pośrednictwem


Instrukcja try-finally

Programu Microsoft

Opisuje następującą składnię: try-finally instrukcji:

__try {
   // guarded code
}
__finally {
   // termination code
}

Gramatyka

  • try-finally instrukcja:
    __try związek oświadczenie

    __finally związek oświadczenie

try-finally Instrukcja jest rozszerzenie Microsoft do języków c i C++, który umożliwia aplikacjom docelowych zagwarantować wykonanie kodu, gdy wykonanie bloku kodu zostanie przerwane.Oczyszczanie składa się z takich zadań jak cofanie przydziału pamięci, zamykanie plików i zwalniania uchwytów plików.try-finally Instrukcji jest szczególnie użyteczna dla procedur, które mają kilka miejsc, w którym dokonywana jest kontrola na błąd, który może spowodować, że przedwczesne powrócić z rutynowych.

Dla pokrewnych informacji i kod przykładowy, zobacz try-z wyjątkiem instrukcji.Aby uzyskać więcej informacji dotyczących strukturalnej w ogólności obsługi wyjątków, zobacz Strukturalnej obsługi wyjątków.Aby uzyskać więcej informacji dotyczących obsługi wyjątków w zarządzanych aplikacji, zobacz Obsługa wyjątków w obszarze/CLR.

[!UWAGA]

Structured exception obsługi programu works z systemu Win32 dla plików źródłowych zarówno c i C++.Jednak to nie zaprojektowano dla języka C++.Aby zapewnić, że kod jest bardziej poręczny, korzystając z obsługi wyjątków C++.Obsługę wyjątków C++ jest również bardziej elastyczne, że można go obsługi wyjątków dowolnego typu.W przypadku programów C++, zalecane jest używany mechanizm obsługi wyjątków C++ (Spróbuj, połowu i throw sprawozdania).

Instrukcja złożona po __try klauzuli jest strzeżony sekcji.Instrukcja złożona po __finally klauzuli jest procedura obsługi sytuacji krańcowych.Program obsługi określa zestaw akcji po sekcji strzeżony jest zakończony, niezależnie od tego, czy został zakończony strzeżony sekcji wyjątek (Nienormalne zakończenie) lub standardowego fall za pośrednictwem (normalna zakończenia).

Sterowanie osiągnie __try oświadczenie sekwencyjne wykonanie prostych (poniżej).Gdy formant przechodzi __try, jego obsługa skojarzona staje się aktywny.Jeśli przepływ sterowania osiąga koniec bloku try, wykonanie postępuje w następujący sposób:

  1. Procedury obsługi sytuacji krańcowych jest wywoływany.

  2. Po zakończeniu procedury obsługi sytuacji krańcowych, wykonywanie jest kontynuowane po __finally instrukcji.Niezależnie od sposobu strzeżony kończy się sekcji (na przykład, za pośrednictwem goto z strzeżonym lub return instrukcji), wykonywana jest procedura obsługi sytuacji krańcowych before przepływ sterowania przenosi się z sekcji strzeżony.

    A __finally instrukcja nie blokuje wyszukiwanie procedury obsługi wyjątków właściwe.

Jeśli wystąpi wyjątek w __try bloku, system operacyjny musi znaleźć narzędzia obsługi wyjątku lub program zakończy się niepowodzeniem.Jeśli program obsługi zostanie znaleziony, wszystkie __finally bloki są wykonywane i wykonanie wznawia działanie programu obsługi.

Na przykład załóżmy szereg funkcji wywołania łącza funkcji a działał D, jak pokazano na poniższym rysunku.Każda funkcja ma jeden procedury obsługi sytuacji krańcowych.Jeśli wyjątek jest wywoływane w funkcji d i obsługiwane w A, procedury obsługi sytuacji krańcowych są nazywane w tej kolejności, jak system odkręcania stosu: D, C, B.

Kolejność wykonywania procedury obsługi sytuacji krańcowych

Kolejność przerywania wykonywania obsługi

[!UWAGA]

Zachowanie try-finally różni się od innych języków, które obsługują ostatecznie, takich jak C#.Pojedynczy __try może być albo, ale nie obie z __finally i __except.Jeśli oba mają być używane razem, zewnętrzny try-z wyjątkiem instrukcji należy ująć instrukcji wewnętrzna try-finally.Zasady określające podczas każdego bloku wykonuje również są różne.

Słowo kluczowe __leave

__leave Słowo kluczowe jest prawidłowy tylko wewnątrz sekcji strzeżony try-finally instrukcji i jego wpływ ma przejść do końca sekcji strzeżony.Wykonywanie jest kontynuowane na pierwszą instrukcją w obsłudze rozwiązania.

A goto instrukcji może również jump out of strzeżony sekcji, ale obniża wydajność, ponieważ wywołuje, niekontrolowanej stosu.__leave Instrukcja jest bardziej efektywne, ponieważ nie powoduje niekontrolowanej stosu.

Nienormalne zakończenie

Zamykanie try-finally za pomocą instrukcji longjmp run-time, funkcja jest uważany za nieprawidłowego przerwania pracy.Nie jest dozwolone, aby przeskoczyć do __try instrukcji, ale prawne, aby przejść o jeden.Wszystkie __finally instrukcji, które są aktywne między punktem odjazdu (normalnej zakończenie __try bloku) i miejsca przeznaczenia ( __except bloku, który obsługuje dany wyjątek) musi być uruchomiona.Jest to zwane lokalnym odkręcaniem.

Jeśli Spróbuj bloku przedwcześnie z jakiegokolwiek powodu, łącznie z skoku bloku, system wykonuje skojarzonym ostatecznie blok jako część procesu niekontrolowanej stosu.W takich przypadkach AbnormalTermination funkcja zwraca wartość PRAWDA, jeśli wywołana z poziomu ostatecznie zablokować; w przeciwnym razie zwraca wartość FALSE.

Procedury obsługi sytuacji krańcowych nie zostanie wywołana, jeśli proces jest zabitych w środku wykonywania try-finally instrukcji.

KONIEC Microsoft szczególne

Zobacz też

Informacje

Procedury obsługi sytuacji krańcowych pisania

Strukturalnej obsługi (C++) wyjątków

Słów kluczowych języka C++

Termination-Handler Syntax