try-finally — instrukcja
Specyficzne dla firmy Microsoft
Następująca składnia opisuje instrukcję try-finally:
__try {
// guarded code
}
__finally {
// termination code
}
Gramatyka
try-finally-statement:
__try instrukcja złożona__finally instrukcja złożona
Instrukcja try-finally jest rozszerzeniem Microsoft do języków C i C++, która umożliwia aplikacji docelowej 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 zwalnianie uchwytów plików.Instrukcja try-finally jest szczególnie przydatna dla procedur, które mają kilka miejsc, gdzie należy sprawdzić czy nie pojawił się błąd, który może spowodować przedwczesny powrót z procedury.
Aby uzyskać informacje pokrewne i przykładowy kod, zobacz Instrukcja try-except.Aby uzyskać więcej informacji dotyczących obsługi w ogóle wyjątków strukturalnych, zobacz Obsługa wyjątków strukturalnych.Aby uzyskać więcej informacji dotyczących obsługi wyjątków w zarządzanych aplikacjach, zobacz Obsługa wyjątków w obszarze/CLR.
[!UWAGA]
Strukturalna obsługa wyjątków działa z Win32 dla plików z kodem źródłowym Ci C++.Jednakże nie jest szczególnie przeznaczona 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, pod tym względem, że może obsługiwać wyjątki dowolnego typu.Dla programów C++, zalecane jest używanie mechanizmu obsługi wyjątków C++ (instrukcje try, catch i throw).
Złożona instrukcja po klauzuli __try jest chronioną sekcją.Złożona instrukcja po klauzuli __finally to obsługa zakończenia.Obsługa zakończenia określa zestaw akcji, które zostaną wykonane, gdy nastąpi wyjście z sekcji chronionej, niezależnie od tego, czy wyjście z niej nastąpiło z powodu wyjątku (zakończenie nienormalne), czy przez standardowe przejście (zakończenie normalne).
Sterowanie osiąga instrukcję __try przez proste sekwencyjne wykonanie (poniżej).Gdy sterowanie wchodzi do __try, skojarzona obsługa zakończenia staje się aktywna.Jeżeli przepływ sterowania dojdzie do końca bloku try, wykonanie postępuje w następujący sposób:
Program obsługi zakończenia jest wywoływany.
Po zakończeniu obsługi zakończenia, wykonanie jest kontynuowane po instrukcji __finally.Niezależnie od tego, w jaki sposób zakończona zostanie sekcja chroniona (na przykład przez wyjście z chronionej treści za pomocą instrukcji goto lub za pomocą instrukcji return), program obsługi zakończenia zostanie wykonany before przepływ sterowania wyjdzie z sekcji chronionej.
Instrukcja __finally nie blokuje wyszukiwania obsługi odpowiednich wyjątków.
Jeśli wystąpi wyjątek w bloku __try, system operacyjny musi znaleźć narzędzia obsługi wyjątku lub program zakończy się niepowodzeniem.Jeśli program obsługi zostanie znaleziony, wszelkie bloki __finally są wykonywane i wykonanie zostanie wznowione w obsłudze.
Załóżmy na przykład, szereg wywołań funkcji łącza A do funkcji D, jak pokazano na poniższym rysunku.Każda funkcja ma jedno zakończenie programu obsługi.Jeśli wyjątek jest wywoływany w funkcji D i obsługiwany w A, obsługi zakończenia są wywoływane w tej kolejności, jakiej system rozwija stos: D, C, B.
Kolejność wykonywania zakończenia obsługi
[!UWAGA]
Zachowanie try-finally różni się od innych języków, które obsługują korzystanie z finaly, takich jak C#. Pojedynczy __try może posiadać jedno, ale nie oba z __finally i __except. Jeśli oba mają być używane razem, w zewnętrzną instrukcję try-except należy ująć instrukcję wewnętrzną try-finally. Zasady, określające, kiedy każdy blok jest wykonywany również są różne.
Słowo kluczowe __leave
Słowo kluczowe __leave jest prawidłowe tylko wewnątrz sekcji chronionej instrukcji try-finally a jego efektem jest przeskoczenie do końca sekcji strzeżonej.Kontynuuje wykonywanie pierwszej instrukcji w obsłudze rozwiązania.
Instrukcja goto może przeskoczyć poza sekcję zabezpieczoną, ale obniża wydajność, ponieważ wywołuje odwracanie stosu.Instrukcja __leave jest bardziej efektywna, ponieważ nie powoduje rozwijania stosu.
Nienormalne zakończenie
Kończenie instrukcji try-finally za pomocą funkcji czasu wykonywania longjmp jest uważane za nieprawidłowe zakończenie.Skok do instrukcji __try jest niedozwolony, ale dozwolony jest skok na zewnątrz takiej instrukcji.Wszystkie instrukcje __finally, które są aktywne między punktem odjazdu (zwykłe zakończenia bloku __try ) i miejscem docelowym ( blok __except, który obsługuje wyjątek) muszą być uruchomione.Jest to lokalne rozwinięcie.
Jeśli blok try przedwcześnie został zakończony z jakiegokolwiek powodu, w tym wyskoczenie z bloku, system wykonuje skojarzony z nim blok finally jako część procesu odwracanie stosu.W takich przypadkach funkcja AbnormalTermination zwraca wartość PRAWDA, jeśli wywołana wewnątrz bloku finally; w przeciwnym razie zwraca wartość FALSE.
Zakończenie obsługi nie jest wywoływane, jeśli proces jest zabity w środku wykonywania instrukcji try-finally.
KONIEC informacji specyficznych dla firmy Microsoft
Zobacz też
Informacje
Pisanie programu obsługi zakończenia