Udostępnij przez


składnia Termination-Handler

Słowa kluczowe __try i __finally są używane do konstruowania procedury obsługi zakończenia. W poniższym przykładzie przedstawiono strukturę procedury obsługi zakończenia.

__try 
{ 
    // guarded body of code 
 
} 
__finally 
{ 
    // __finally block 
 
}

Aby zapoznać się z przykładami, zobacz Using a Termination Handler.

Podobnie jak w przypadku programu obsługi wyjątków, zarówno blok __try, jak i blok __finally wymagają nawiasów klamrowych ({}), a także użycie instrukcji goto, aby przejść do dowolnego bloku, nie jest dozwolone.

Blok __try zawiera chronioną treść kodu, który jest chroniony przez program obsługi zakończenia. Funkcja może mieć dowolną liczbę procedur obsługi zakończenia, a te bloki obsługi zakończenia można zagnieżdżać w ramach tej samej funkcji lub w różnych funkcjach.

Blok __finally jest wykonywany za każdym razem, gdy przepływ kontrolki opuszcza blok __try. Jednak blok __finally nie jest wykonywany, jeśli wywołasz dowolną z następujących funkcji w bloku __try: ExitProcess, ExitThreadlub przerwać.

Blok __finally jest wykonywany w kontekście funkcji, w której znajduje się procedura obsługi zakończenia. Oznacza to, że blok __finally może uzyskać dostęp do zmiennych lokalnych tej funkcji. Wykonanie bloku __finally może zakończyć się za pomocą dowolnego z poniższych środków.

  • Wykonanie ostatniej instrukcji w bloku i kontynuacja następnej instrukcji
  • Użycie instrukcji sterującej (zwracać, przerwać, kontynuowaćlub )
  • Używanie longjmp lub przechodzenie do procedury obsługi wyjątków

Jeśli wykonanie bloku __try zakończy się z powodu wyjątku, który wywołuje blok obsługi wyjątków programu obsługi wyjątków opartego na ramce, blok __finally jest wykonywany przed wykonaniem bloku obsługi wyjątków. Podobnie wywołanie funkcji biblioteki longjmp języka C z bloku __try powoduje wykonanie bloku __finally przed wznowienia wykonywania na miejscu docelowym operacji longjmp. Jeśli wykonywanie bloku __try zakończy się z powodu instrukcji kontroli (zwracać, przerwać, kontynuowaćlub goto), zostanie wykonany blok __finally.

Funkcja AbnormalTermination może być używana w bloku __finally w celu określenia, czy blok __try zakończył się sekwencyjnie — czyli czy osiągnął zamykający nawias klamrowy (}). Pozostawienie bloku __try z powodu wywołania longjmp, skok do procedury obsługi wyjątków lub zwracania, przerwania, kontynuowaćlub goto instrukcji, jest uważany za nieprawidłowe zakończenie. Należy pamiętać, że niepowodzenie zakończenia sekwencyjnie powoduje, że system będzie przeszukiwał wszystkie ramki stosu w odwrotnej kolejności, aby określić, czy należy wywołać jakiekolwiek programy obsługi zakończenia. Może to spowodować obniżenie wydajności ze względu na wykonanie setek instrukcji.

Aby uniknąć nietypowego zakończenia procedury obsługi zakończenia, wykonanie powinno być kontynuowane na końcu bloku. Można również wykonać instrukcję __leave. Instrukcja __leave umożliwia natychmiastowe zakończenie bloku __try bez powodowania nieprawidłowego zakończenia i jego kary za wykonanie. Sprawdź dokumentację kompilatora, aby określić, czy instrukcja __leave jest obsługiwana.

Jeśli wykonanie bloku __finally zakończy się z powodu zwrócić instrukcję sterowania, jest to równoważne goto do zamykającego nawiasu klamrowego w funkcji otaczającej. W związku z tym funkcja otaczającej zwróci wartość .