Udostępnij za pośrednictwem


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:

  1. Program obsługi zakończenia jest wywoływany.

  2. 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

Kolejność wykonywania przerwanie 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

Obsługa wyjątków strukturalnych (C/C++)

Słowa kluczowe języka C++

Termination-Handler Syntax