Udostępnij za pośrednictwem


try-except, instrukcja (C)

Specyficzne dla firmy Microsoft

Instrukcja try-except to rozszerzenie firmy Microsoft do języka C, które umożliwia aplikacjom uzyskanie kontroli nad programem, gdy występują zdarzenia, które zwykle kończą wykonywanie. Takie zdarzenia nazywane są wyjątkami, a mechanizm, który zajmuje się wyjątkami nazywa się strukturalną obsługą wyjątków.

Wyjątki mogą być oparte na sprzęcie lub oprogramowaniu. Nawet jeśli aplikacje nie mogą całkowicie odzyskać sprawności po wyjątkach sprzętu lub oprogramowania, obsługa wyjątków strukturalnych umożliwia rejestrowanie i wyświetlanie informacji o błędach. Warto wychwytować stan wewnętrzny aplikacji, aby ułatwić diagnozowanie problemu. W szczególności pomocne jest sporadyczne problemy, które nie są łatwe do odtworzenia.

Składnia

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

Instrukcja złożone po klauzuli __try jest sekcją chronioną. Instrukcja złożone po klauzuli jest procedurą __except obsługi wyjątków. Procedura obsługi określa zestaw akcji do wykonania, jeśli podczas wykonywania chronionej sekcji zostanie zgłoszony wyjątek. Wykonanie jest kontynuowane w następujący sposób:

  1. Sekcja chroniona jest wykonywana.

  2. Jeśli podczas wykonywania sekcji chronionej nie wystąpi wyjątek, program kontynuuje wykonywanie instrukcji po klauzuli __except.

  3. Jeśli podczas wykonywania chronionej sekcji wystąpi wyjątek lub w dowolnej procedurze wywołania sekcji chronionej, __except wyrażenie zostanie ocenione. Zwrócona wartość określa sposób obsługi wyjątku. Istnieją trzy możliwe wartości:

    • EXCEPTION_CONTINUE_SEARCH: Wyjątek nie jest rozpoznawany. Kontynuuj wyszukiwanie stosu dla procedury obsługi, najpierw w przypadku instrukcji zawierających try-except instrukcje, a następnie dla procedur obsługi z następnym najwyższym priorytetem.

    • EXCEPTION_CONTINUE_EXECUTION: Wyjątek jest rozpoznawany, ale odrzucony. Kontynuuj wykonywanie w punkcie, w którym wystąpił wyjątek.

    • EXCEPTION_EXECUTE_HANDLER Wyjątek jest rozpoznawany. Przenieś kontrolkę do procedury obsługi wyjątków, wykonując instrukcję __except złożonej, a następnie kontynuuj wykonywanie w momencie wystąpienia wyjątku.

__except Ponieważ wyrażenie jest obliczane jako wyrażenie języka C, jest ograniczone do pojedynczej wartości, operatora wyrażenia warunkowego lub operatora przecinka. Jeśli wymagane jest bardziej rozległe przetwarzanie, wyrażenie może wywołać procedurę, która zwraca jedną z trzech wartości wymienionych powyżej.

Uwaga

Obsługa wyjątków strukturalnych działa z plikami źródłowymi C i C++. Nie jest to jednak specjalnie zaprojektowane dla języka C++. W przypadku przenośnych programów języka C++ należy używać obsługi wyjątków w języku C++ zamiast obsługi wyjątków strukturalnych. Ponadto mechanizm obsługi wyjątków języka C++ jest znacznie bardziej elastyczny, ponieważ może obsługiwać wyjątki dowolnego typu. Aby uzyskać więcej informacji, zobacz Obsługa wyjątków w dokumentacji języka C++.

Każda procedura w aplikacji może mieć własną procedurę obsługi wyjątków. Wyrażenie __except jest wykonywane w zakresie __try treści. Ma on dostęp do dowolnych zmiennych lokalnych zadeklarowanych tam.

Słowo __leave kluczowe jest prawidłowe w try-except bloku instrukcji. Efektem __leave jest przejście na koniec try-except bloku. Wykonanie zostanie wznowione po zakończeniu programu obsługi wyjątków. goto Mimo że instrukcja może służyć do osiągnięcia tego samego wyniku, goto instrukcja powoduje odwijanie stosu. Instrukcja __leave jest wydajniejsza, ponieważ nie obejmuje odwijania stosu.

Zakończenie instrukcji try-except przy użyciu longjmp funkcji 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. Procedura obsługi wyjątków nie jest wywoływana, jeśli proces zostanie zabity w trakcie wykonywania try-except instrukcji.

Przykład

Oto przykład procedury obsługi wyjątków i procedury obsługi zakończenia. Aby uzyskać więcej informacji na temat procedur obsługi zakończenia, zobacz try-finally instrukcję (C).

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

Oto dane wyjściowe z przykładu z komentarzem dodanym po prawej stronie:

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

KONIEC specyficzny dla firmy Microsoft

Zobacz też

try-except instrukcja (C++)