Udostępnij za pośrednictwem


Spróbuj-z wyjątkiem wyciągu

Programu Microsoft

Następująca składnia opisuje try-z wyjątkiem instrukcji:

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

Uwagi

Try-z wyjątkiem instrukcja jest rozszerzenie Microsoft c i języków C++, które umożliwia aplikacji docelowej uzyskanie kontroli, kiedy występują zdarzenia, które normalnie zakończyć działanie programu.Takie zdarzenia są nazywane wyjątki i mechanizm, który zajmuje się wyjątków jest nazywany structured exception handling.

Aby uzyskać pokrewne informacje, zobacz try-finally instrukcji.

Wyjątki mogą być albo sprzętowy lub programowy.Nawet w przypadku, gdy aplikacje nie można całkowicie odzyskać wyjątki sprzętowe lub programowe, structured exception handling umożliwia wyświetlanie informacji o błędach i pułapek wewnętrzny stan aplikacji w celu zdiagnozowania problemu.Jest to szczególnie użyteczne w przypadku sporadyczne problemy, których nie można łatwo odtworzyć.

[!UWAGA]

Structured exception obsługi programu works z systemu Win32 dla plików źródłowych zarówno c i C++.Jednak to nie zaprojektowano dla języka C++.Aby zapewnić, że kod jest bardziej poręczny, korzystając z obsługi wyjątków C++.Obsługę wyjątków C++ jest również bardziej elastyczne, że można go obsługi wyjątków dowolnego typu.W przypadku programów C++, zalecane jest używany mechanizm obsługi wyjątków C++ (Spróbuj, połowu i throw sprawozdania).

Instrukcja złożona po __try klauzuli jest organ lub strzeżony sekcji.Instrukcja złożona po __except klauzuli jest obsługa wyjątków.Program obsługi określa zestaw akcji, które mają być podjęte, jeśli tworzony jest wyjątek podczas wykonywania treści strzeżony sekcji.Wykonanie postępuje w następujący sposób:

  1. Sekcja strzeżony jest wykonywana.

  2. Jeśli nie wystąpi wyjątek podczas wykonywania strzeżony sekcji, wykonywanie jest kontynuowane po instrukcji __except klauzuli.

  3. Jeśli wystąpi wyjątek podczas wykonywania strzeżony sekcji lub wszelkie rutynowe strzeżony sekcji wywołuje, __exceptwyrażenie (o nazwie filtru wyrażenie) jest oceniany i wartość określa sposób obsługi wyjątków. Istnieją trzy wartości:

    EXCEPTION_CONTINUE_EXECUTION (–1) wyjątek zostaje oddalony.Kontynuować działanie w punkcie, w którym wystąpił wyjątek.

    EXCEPTION_CONTINUE_SEARCH (0) wyjątku nie jest rozpoznawany.Kontynuować wyszukiwanie górę stosu obsługi, najpierw zawierających try-z wyjątkiem sprawozdania, następnie obsługi z następny najwyższy priorytet.

    EXCEPTION_EXECUTE_HANDLER (1) wyjątek został rozpoznany.Przenieść formant do procedury obsługi wyjątków przez wykonanie __except złożone oświadczenia, a następnie kontynuować działanie po __except bloku.

Ponieważ __z wyjątkiem wyrażenie jest oceniane jako c wyrażenie, jest ograniczone do pojedynczej wartości, operator wyrażenia warunkowe lub operatorem przecinka.Jeśli wymagane jest przetwarzanie bardziej rozległe, wyrażenie można wywołać procedury, które zwraca jeden z trzech wartości wymienionych powyżej.

Każda aplikacja może mieć własne procedury obsługi wyjątków.

Nie jest ważne, aby przeskoczyć do __try instrukcji, ale jest to ważne, aby przejść o jeden.Obsługa wyjątków nie jest wywoływana, jeśli proces zostanie zakończony w środku wykonywania try-z wyjątkiem instrukcji.

Aby uzyskać więcej informacji, zobacz artykuł bazy wiedzy Knowledge Base Q315937: HOW TO: przepełnienie stosu zalewki w aplikacji Visual C++.

Słowo kluczowe __leave

__leave Słowo kluczowe jest prawidłowy tylko wewnątrz sekcji strzeżony try-except instrukcji i jego wpływ ma przejść do końca sekcji strzeżony.Wykonywanie jest kontynuowane na pierwszej instrukcji po obsługi wyjątków.

A goto instrukcji również przeskoczyć z sekcji strzeżony i go nie obniżyć wydajność jak try-finally instrukcji, ponieważ stos niekontrolowanej nie występuje.Jednakże firma Microsoft zaleca użycie __leave słowa kluczowego zamiast goto instrukcji, ponieważ jest mniej prawdopodobne pomyłka programowania, jeśli sekcja strzeżony jest dużych lub złożonych.

s58ftw19.collapse_all(pl-pl,VS.110).gifStructured Exception wewnętrzne funkcje do obsługi

Structured exception handling zawiera dwie funkcje wewnętrzne, które są dostępne do użycia z try-z wyjątkiem instrukcji: GetExceptionCode i GetExceptionInformation.

GetExceptionCode zwraca kod wyjątku (liczba całkowita 32-bitowa).

Wewnętrzna funkcja GetExceptionInformation zwraca wskaźnik do struktury, zawierające dodatkowe informacje o wyjątku.Za pomocą tego wskaźnika można uzyskać dostęp stan maszyny, które istniały w momencie, z wyjątkiem sprzętu.Struktura jest w następujący sposób:

struct _EXCEPTION_POINTERS {
      EXCEPTION_RECORD *ExceptionRecord,
      CONTEXT *ContextRecord }

Wskaźnik typy _EXCEPTION_RECORD i _kontekst są zdefiniowane w pliku include, z wyjątkiem.H.

Można użyć GetExceptionCode w ramach procedury obsługi wyjątków.Można jednak użyć GetExceptionInformation tylko w obrębie wyrażenie filtru wyjątków.Informacje, które wskazuje jest ogólnie na stosie i nie będzie już dostępne podczas kontroli jest przekazywane do procedury obsługi wyjątków.

Wewnętrzna funkcja AbnormalTermination jest dostępna w ramach procedury obsługi sytuacji krańcowych.Zwraca 0, jeżeli organ try-finally instrukcji kończy sekwencyjnie.We wszystkich pozostałych przypadkach zwraca 1.

Z WYJĄTKIEM.H definiuje kilka alternatywnych nazw dla tych intrinsics:

GetExceptionCode jest równoważne z _exception_code

GetExceptionInformation jest równoważne z _exception_info

AbnormalTermination jest równoważne z _abnormal_termination

Przykład

// exceptions_try_except_Statement.cpp

// Example of try-except and try-finally statements

#include <stdio.h>

#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION

#include <excpt.h>

int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {

   puts("in filter.");

   if (code == EXCEPTION_ACCESS_VIOLATION) {

      puts("caught AV as expected.");

      return EXCEPTION_EXECUTE_HANDLER;

   }

   else {

      puts("didn't catch AV, unexpected.");

      return EXCEPTION_CONTINUE_SEARCH;

   };

}

int main()

{

   int* p = 0x00000000;   // pointer to NULL

   puts("hello");

   __try{

      puts("in try");

      __try{

         puts("in try");

         *p = 13;    // causes an access violation exception;

      }__finally{

puts("in finally. termination: ");

puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");

      }

   }__except(filter(GetExceptionCode(), GetExceptionInformation())){

      puts("in except");

   }

   puts("world");

}

Dane wyjściowe

hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
        abnormal
in except
world

KONIEC Microsoft szczególne

Zobacz też

Informacje

Pisanie procedury obsługi wyjątków

Strukturalnej obsługi (C++) wyjątków

Słów kluczowych języka C++