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:
Sekcja strzeżony jest wykonywana.
Jeśli nie wystąpi wyjątek podczas wykonywania strzeżony sekcji, wykonywanie jest kontynuowane po instrukcji __except klauzuli.
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.
Structured 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