/EH (Model obsługi wyjątku)/EH (Exception Handling Model)

Określa rodzaj obsługi wyjątku przez kompilator, gdy Optymalizacja odkładania wyjątek sprawdza oraz czy niszczy obiektów C++, które wykraczają poza zakres z powodu wyjątku.Specifies the kind of exception handling used by the compiler, when to optimize away exception checks, and whether to destroy C++ objects that go out of scope because of an exception. Jeśli /EH nie zostanie określony, kompilator zapewnia swój kod, aby przechwytywać wyjątki C++ i asynchroniczne wyjątki strukturalne, ale nie niszczy obiektów C++, które wykraczają poza zakres z powodu wyjątku asynchronicznego.If /EH is not specified, the compiler enables your code to catch both asynchronous structured exceptions and C++ exceptions, but does not destroy C++ objects that go out of scope because of an asynchronous exception.

SkładniaSyntax

/EH{s|a}[c][r][-]/EH{s|a}[c][r][-]

ArgumentyArguments

aa
Model obsługi wyjątków, który wyłapuje asynchroniczne (strukturalne) i synchronicznej wyjątków (C++) przy użyciu języka c++ catch(...) składni.The exception-handling model that catches both asynchronous (structured) and synchronous (C++) exceptions by use of C++ catch(...) syntax.

ss
Model obsługi wyjątków, który przechwytuje synchronicznej wyjątków (C++) i informuje kompilator, aby założył, że funkcje zadeklarowane jako extern "C" może zgłosić wyjątek.The exception-handling model that catches synchronous (C++) exceptions only and tells the compiler to assume that functions declared as extern "C" may throw an exception.

cc
Jeśli używane s (/ehsc), wychwytuje tylko wyjątki C++ i informuje kompilator, aby założył, że funkcje zadeklarowane jako extern "C" nigdy nie zgłaszają wyjątków C++.If used with s (/EHsc), catches C++ exceptions only and tells the compiler to assume that functions declared as extern "C" never throw a C++ exception. / EHca jest odpowiednikiem /eha./EHca is equivalent to /EHa.

rr
Informuje kompilator, aby zawsze Generuj operacje sprawdzania zakończenia środowiska uruchomieniowego dla wszystkich noexcept funkcji.Tells the compiler to always generate runtime termination checks for all noexcept functions. Domyślnie środowisko uruchomieniowe sprawdza, czy noexcept może optymalizacji Jeśli kompilator określa funkcja wywołuje tylko niezgłaszające funkcje.By default, runtime checks for noexcept may be optimized away if the compiler determines the function calls only non-throwing functions.

UwagiRemarks

/Eha — opcja kompilatora jest używana do obsługi asynchronicznego strukturalna Obsługa wyjątków (SEH) za pomocą natywnego języka C++ catch(...) klauzuli.The /EHa compiler option is used to support asynchronous structured exception handling (SEH) with the native C++ catch(...) clause. Aby zaimplementować SEH bez określania /eha, może używać __try, __except, i __finally składni.To implement SEH without specifying /EHa, you may use the __try, __except, and __finally syntax. Mimo że Windows i Visual C++ obsługuje SEH, zdecydowanie zalecamy używanie obsługi wyjątków ISO standard C++ (/EHS lub /ehsc), ponieważ dzięki niej kod jest bardziej przenośny i elastyczny.Although Windows and Visual C++ support SEH, we strongly recommend that you use ISO-standard C++ exception handling (/EHs or /EHsc) because it makes code more portable and flexible. Niemniej jednak w istniejącym kodzie lub dla szczególnych typów programów — na przykład w kodzie skompilowanym z obsługą środowiska uruchomieniowego języka wspólnego (/CLR (kompilacja języka wspólnego środowiska uruchomieniowego)) — nadal może być konieczne używanie SEH.Nevertheless, in existing code or for particular kinds of programs—for example, in code compiled to support the common language runtime (/clr (Common Language Runtime Compilation))—you still might have to use SEH. Aby uzyskać więcej informacji, zobacz obsługi wyjątków strukturalnych, (C/C++).For more information, see Structured Exception Handling (C/C++).

Określanie /eha i próba obsługi wszystkich wyjątków za pomocą catch(...) może być niebezpieczne.Specifying /EHa and trying to handle all exceptions by using catch(...) can be dangerous. W większości przypadków wyjątki asynchroniczne są nie do odzyskania i powinny być uważane za krytyczne.In most cases, asynchronous exceptions are unrecoverable and should be considered fatal. Ich wychwytywanie i kontynuacja wykonania aplikacji może spowodować uszkodzenie procesu i prowadzić do błędów, które trudno znaleźć i naprawić.Catching them and proceeding can cause process corruption and lead to bugs that are hard to find and fix.

Jeśli używasz /EHS lub /ehsc, wówczas catch(...) klauzuli nie wychwytuje asynchronicznych wyjątków strukturalnych.If you use /EHs or /EHsc, then your catch(...) clause does not catch asynchronous structured exceptions. Naruszenia zasad dostępu i zarządzane System.Exception wyjątki nie są przechwytywane i obiekty w zakresie podczas generowania wyjątku asynchronicznego nie są niszczone, nawet jeśli asynchroniczny wyjątek jest obsługiwany.Access violations and managed System.Exception exceptions are not caught, and objects in scope when an asynchronous exception is generated are not destroyed even if the asynchronous exception is handled.

Jeśli używasz /eha, obraz, który może być większy i może wykonać mniej dobrze, ponieważ kompilator nie optymalizuje spróbuj tak agresywnie.If you use /EHa, the image may be larger and might perform less well because the compiler does not optimize a try block as aggressively. Również pozostawia filtry wyjątków, które automatycznie wywołują destruktory wszystkich obiektów lokalnych, nawet jeśli kompilator nie widzi żadnego kodu, który może zgłosić wyjątek języka C++.It also leaves in exception filters that automatically call the destructors of all local objects even if the compiler does not see any code that can throw a C++ exception. Umożliwia to bezpieczne odwracanie stosu dla wyjątków asynchronicznych oraz wyjątków C++.This enables safe stack unwinding for asynchronous exceptions as well as for C++ exceptions. Kiedy używasz /EHS, kompilator zakłada, że wyjątki mogą znajdować się tylko na throw instrukcji lub w wywołaniu funkcji.When you use /EHs, the compiler assumes that exceptions can only occur at a throw statement or at a function call. Dzięki temu kompilator eliminuje kod śledzenia okresu istnienia wielu odwracalnych obiektów, co może znacznie zmniejszyć rozmiar kodu.This allows the compiler to eliminate code for tracking the lifetime of many unwindable objects, and this can significantly reduce code size.

Firma Microsoft zaleca, aby nie łączyć obiektów skompilowanych przy użyciu /eha z obiektami skompilowanymi przy użyciu /EHS lub /ehsc w tym samym module pliku wykonywalnego.We recommend that you not link objects compiled by using /EHa together with objects compiled by using /EHs or /EHsc in the same executable module. Jeśli trzeba obsługiwać wyjątek asynchroniczny przy użyciu /eha gdziekolwiek w module, użyj /eha do skompilowania całego kodu w module.If you have to handle an asynchronous exception by using /EHa anywhere in your module, use /EHa to compile all the code in the module. Możesz użyć składni, w tym samym module co kod jest kompilowany przy użyciu obsługi wyjątków strukturalnych /EHS, ale nie możesz mieszać składni SEH z spróbuj, throwi catch w tej samej funkcji.You can use structured exception handling syntax in the same module as code that's compiled by using /EHs, but you can’t mix the SEH syntax with try, throw, and catch in the same function.

Użyj /eha Jeśli chcesz przechwytywać wyjątek, który jest wywoływany przez coś innego niż throw.Use /EHa if you want to catch an exception that's raised by something other than a throw. Ten przykład generuje i wychwytuje wyjątek strukturalny:This example generates and catches a structured exception:

// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;

void fail() {   // generates SE and attempts to catch it using catch(...)
   try {
      int i = 0, j = 1;
      j /= i;   // This will throw a SE (divide by zero).
      printf("%d", j);
   }
   catch(...) {   // catch block will only be executed under /EHa
      cout<<"Caught an exception in catch(...)."<<endl;
   }
}

int main() {
   __try {
      fail();
   }

   // __except will only catch an exception here
   __except(EXCEPTION_EXECUTE_HANDLER) {
      // if the exception was not caught by the catch(...) inside fail()
      cout << "An exception was caught in __except." << endl;
   }
}

Opcja/ehc opcja wymaga, aby /EHS lub /eha jest określony.The /EHc option requires that /EHs or /EHa is specified. /CLR oznacza opcji /eha (czyli /CLR /eha jest nadmiarowy).The /clr option implies /EHa (that is, /clr /EHa is redundant). Kompilator generuje błąd, jeśli /EHS lub /ehsc jest używany po /CLR.The compiler generates an error if /EHs or /EHsc is used after /clr. Optymalizacje nie wpływają na to zachowanie.Optimizations do not affect this behavior. Gdy zostaje przechwycony wyjątek, kompilator wywołuje destruktor klasy lub destruktory obiektu lub obiektów, które znajdują się w tym samym zakresie, co wyjątek.When an exception is caught, the compiler invokes the class destructor or destructors for the object or objects that are in the same scope as the exception. Gdy nie przechwycono wyjątku, te destruktory nie są uruchamiane.When an exception is not caught, those destructors are not run.

Aby uzyskać informacje na temat ograniczeń obsługi wyjątków w /CLR, zobacz _set_se_translator.For information about exception handling restrictions under /clr, see _set_se_translator.

Opcja może być obsadzona przez przy użyciu symbolu -.The option can be cleared by using the symbol -. Na przykład /EHsc- jest interpretowany jako /EHS /EHc- i jest odpowiednikiem /EHS.For example, /EHsc- is interpreted as /EHs /EHc- and is equivalent to /EHs.

/EHr — opcja kompilatora wymusza operacje sprawdzania zakończenia środowiska uruchomieniowego w wszystkie funkcje, które mają noexcept atrybutu.The /EHr compiler option forces runtime termination checks in all functions that have a noexcept attribute. Domyślnie testy środowiska uruchomieniowego może być w celu optymalizacji Jeśli zapleczu kompilatora okaże się, czy funkcja tylko wywołuje niezgłaszające funkcji.By default, runtime checks may be optimized away if the compiler back end determines that a function only calls non-throwing functions. Zgłaszanie inne niż funkcje są wszystkie funkcje, które mają atrybut określający, że żadne wyjątki, które mogą być generowane.Non-throwing functions are any functions that have an attribute that specifies no exceptions may be thrown. W tym funkcje oznaczone noexcept, throw(), __declspec(nothrow)i kiedy opcja/ehc jest określony, extern "C" funkcji.This includes functions marked noexcept, throw(), __declspec(nothrow), and, when /EHc is specified, extern "C" functions. Zgłaszanie inne niż funkcje także tych, które kompilator ustalił, czy niezgłaszające inspekcja.Non-throwing functions also include any that the compiler has determined are non-throwing by inspection. Wartość domyślna została jawnie ustawiona przy użyciu /EHr-.You can explicitly set the default by using /EHr-.

Jednak atrybut niezgłaszające jest gwarancję, że żadne wyjątki mogą być generowane przez funkcję.However, the non-throwing attribute is not a guarantee that no exceptions can be thrown by a function. W odróżnieniu od zachowania noexcept funkcji, za pomocą kompilatora MSVC uwzględnia wyjątek zgłoszony przez funkcje zadeklarowane za pomocą throw(), __declspec(nothrow), lub extern "C" jako niezdefiniowane zachowanie.Unlike the behavior of a noexcept function, the MSVC compiler considers an exception thrown by a function declared using throw(), __declspec(nothrow), or extern "C" as undefined behavior. Funkcje korzystające z tych trzech deklaracji atrybutów nie wymuszają operacje sprawdzania zakończenia środowiska uruchomieniowego do obsługi wyjątków.Functions that use these three declaration attributes do not enforce runtime termination checks for exceptions. Możesz użyć /EHr opcję, aby pomóc w zidentyfikowaniu to niezdefiniowane zachowanie, wymuszając kompilatorowi Generowanie testy środowiska uruchomieniowego dla nieobsłużonych wyjątków, które ucieczki noexcept funkcji.You can use the /EHr option to help you identify this undefined behavior, by forcing the compiler to generate runtime checks for unhandled exceptions that escape a noexcept function.

Aby ustawić tę opcję kompilatora w środowisku programowania Visual StudioTo set this compiler option in the Visual Studio development environment

  1. Otwórz projekt stron właściwości okno dialogowe.Open the project's Property Pages dialog box. Aby uzyskać więcej informacji, zobacz kompilatora i tworzenia właściwości ustaw C++ w programie Visual Studio.For details, see Set C++ compiler and build properties in Visual Studio.

  2. Wybierz właściwości konfiguracji > C/C++ > generowanie kodu.Select Configuration Properties > C/C++ > Code Generation.

  3. Modyfikowanie włącz wyjątki C++ właściwości.Modify the Enable C++ Exceptions property.

    Lub ustaw włącz wyjątki C++ do nie, a następnie na wiersza polecenia stronie właściwości, dodatkowe opcje Dodaj — Opcja kompilatora.Or, set Enable C++ Exceptions to No, and then on the Command Line property page, in the Additional Options box, add the compiler option.

Aby programowo ustawić tę opcję kompilatoraTo set this compiler option programmatically

Zobacz takżeSee also

Opcje kompilatora MSVCMSVC Compiler Options
Składnia wiersza polecenia kompilatora MSVCMSVC Compiler Command-Line Syntax
Błędy w obsłudze wyjątkówErrors and Exception Handling
Specyfikacje wyjątków (throw)Exception Specifications (throw)
Obsługa wyjątków strukturalnych (C/C++)Structured Exception Handling (C/C++)