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 aplikacji na uzyskanie kontroli nad zdarzeniami, które normalnie powodują wykonanie zamknięcia.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ć sprzętowe lub programowe.Nawet wtedy, gdy aplikacja nie może całkowicie odzyskać sprawności po wystąpieniu wyjątku sprzętowego lub programowego, strukturalna obsługa wyjątków umożliwia wyświetlenie informacji o błędzie i przechwytuje wewnętrzny stan aplikacji, aby pomóc w zdiagnozowaniu problemu.Jest to szczególnie użyteczne w przypadku sporadycznych problemów, których nie można łatwo odtworzyć.

Składnia

  • instrukcja try-except:
    __try instrukcja-złożona

    __except ( wyrażenie ) instrukcja-złożona

Złożone instrukcje po klauzuli __try to sekcje chronione.Złożona instrukcja po klauzuli __except to obsługa wyjątków.Kod obsługi wyjątku określa zestaw akcji, które zostaną wykonane jeśli wystąpi wyjątek w chronionej sekcji.Wykonanie działa w następujący sposób:

  1. Sekcja chroniona jest wykonywana.

  2. Jeśli podczas wykonywania sekcji strzeżonej nie wystąpi wyjątek, program kontynuuje wykonywanie instrukcji znajdującej się po klauzuli __except.

  3. Jeśli wystąpi wyjątek podczas wykonywania sekcji chronionej lub wyjątek wystąpi w dowolnym fragmencie wywoływanym przez sekcję chronioną, wyrażenie__except jest sprawdzane a zwracana wartość określa sposób obsługi wyjątku.Istnieją trzy wartości:

    EXCEPTION_CONTINUE_SEARCH   Wyjątek nie jest rozpoznawany.Kontynuuj przeszukiwanie stosu w celu znalezienia fragmentu obsługującego wyjątek, najpierw zawierającego wyrażenia try-except a następnie z następnym największym pierwszeństwem.

    EXCEPTION_CONTINUE_EXECUTION   Wyjątkiem jest rozpoznany, ale został odrzucony.Kontynuuj wykonywanie w punkcie, w którym wystąpił wyjątek.

    EXCEPTION_EXECUTE_HANDLER   Wyjątek został rozpoznany.Przenieś kontrolę do obsługi wyjątków, przez wykonywanie instrukcji złożonej __except, a następnie kontynuuj wykonywanie w punkcie wystąpienia wyjątku.

Ponieważ wyrażenie __except jest oszacowane tak samo jak wyrażenie C, to 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 języków C i C++.Jednakże, nie została szczególnie zaprojektowana dla języka C++.Możesz zapewnić większą przenośność kodu przy użyciu obsługi wyjątków języka C++.Ponadto, mechanizm obsługi wyjątków języka C++ jest dużo bardziej elastyczny, pod tym względem, że może obsługiwać wyjątki dowolnego typu.

[!UWAGA]

Dla programów napisanych w języku C++, obsługa wyjątków języka C++ powinna być używana zamiast obsługi wyjątków strukturalnych.Aby uzyskać więcej informacji, zobacz Obsługa wyjątków w Informacje dotyczące języka C++.

Wszystkie procedury w aplikacji mogą mieć własną obsługę wyjątków.Wyrażenie __except jest wykonuje w danym zakresie ciała __try.Oznacza to, że ma dostęp do zmiennych lokalnych tam zadeklarowanych.

Słowo kluczowe __leave jest prawidłowe w bloku instrukcji try-except.Efektem działania instrukcji __leave jest skok na koniec bloku try-except.Wykonanie zostanie wznowione po zakończeniu obsługi wyjątków.Chociaż instrukcja goto może być używana do osiągnięcia tego samego wyniku, instrukcja goto powoduje rozwijanie stosu.Instrukcja __leave jest bardziej efektywna, ponieważ nie wymaga rozwijania stosu.

Kończenie instrukcji try-except 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.Obsługa wyjątków nie jest wywoływana, jeśli proces zostanie zabity w środku wykonywania instrukcji try-except.

Przykład

Poniżej znajduje się przykład obsługi wyjątków i obsługa zakończenia.Zobacz Instrukcja try-finally, aby uzyskać więcej informacji dotyczących obsługi zakończenia.

.
.
.
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");

Są to 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 informacji specyficznych dla firmy Microsoft

Zobacz też

Informacje

try-except — instrukcja