/EH (Özel durum işleme modeli)/EH (Exception handling model)

Derleyici tarafından oluşturulan özel durum işleme modeli desteğini belirtir.Specifies the exception handling model support generated by the compiler. Bağımsız değişkenler catch(...) , hem yapılandırılmış hem de standart C++ özel durumlarına sözdiziminin uygulanıp uygulanmayacağını, ** extern "C"** kodunun özel durumlara kabul edilip edilmeyeceğini throw ve belirli denetimleri iyileştirip iyileştirmeyeceğini belirtir noexcept .Arguments specify whether to apply catch(...) syntax to both structured and standard C++ exceptions, whether extern "C" code is assumed to throw exceptions, and whether to optimize away certain noexcept checks.

SyntaxSyntax

/EHa[-]/EHa[-]
/EHs[-]/EHs[-]
/EHc[-]/EHc[-]
/EHr[-]/EHr[-]

ArgumentsArguments

a
Standart C++ yığını geriye doğru izlemeyi mümkün.Enables standard C++ stack unwinding. Sözdizimi kullandığınızda hem yapılandırılmış (zaman uyumsuz) hem de standart C++ (zaman uyumlu) özel durumlarını yakalar catch(...) .Catches both structured (asynchronous) and standard C++ (synchronous) exceptions when you use catch(...) syntax. /EHa hem hem /EHs de /EHc bağımsız değişkenlerini geçersiz kılar./EHa overrides both /EHs and /EHc arguments.

s
Standart C++ yığını geriye doğru izlemeyi mümkün.Enables standard C++ stack unwinding. Söz dizimi kullandığınızda yalnızca standart C++ özel durumlarını yakalar catch(...) .Catches only standard C++ exceptions when you use catch(...) syntax. /EHc Ayrıca belirtilmediği sürece, derleyici ** extern "C"** olarak belirtilen işlevlerin throw bir C++ özel durumu olabileceğini varsayar.Unless /EHc is also specified, the compiler assumes that functions declared as extern "C" may throw a C++ exception.

c
İle kullanıldığında /EHs , derleyici ** extern "C"** olarak belirtilen işlevlerin hiçbir zaman throw C++ özel durumu olarak olduğunu varsayar.When used with /EHs, the compiler assumes that functions declared as extern "C" never throw a C++ exception. İle kullanıldığında /EHa (yani, /EHca öğesine eşdeğerdir) hiçbir etkisi yoktur /EHa .It has no effect when used with /EHa (that is, /EHca is equivalent to /EHa). /EHc belirtilmemişse, yok /EHs sayılır /EHa ./EHc is ignored if /EHs or /EHa aren't specified.

r
Derleyiciye tüm işlevler için her zaman çalışma zamanı sonlandırma denetimleri oluşturmasını söyler noexcept .Tells the compiler to always generate runtime termination checks for all noexcept functions. Varsayılan olarak, noexcept derleyici işlevi yalnızca kullanmayan işlevleri çağırdığında, çalışma zamanı denetimleri en iyi duruma getirilebilir throw .By default, runtime checks for noexcept may be optimized away if the compiler determines the function calls only non-throwing functions. Bu seçenek, bazı ek kodların maliyetiyle katı C++ uygunluğu sağlar.This option gives strict C++ conformance at the cost of some extra code. /EHr belirtilmemişse, yok /EHs sayılır /EHa ./EHr is ignored if /EHs or /EHa aren't specified.

-
Önceki seçenek bağımsız değişkenini temizler.Clears the previous option argument. Örneğin, /EHsc- olarak yorumlanır ve ile /EHs /EHc- eşdeğerdir /EHs .For example, /EHsc- is interpreted as /EHs /EHc-, and is equivalent to /EHs.

/EH bağımsız değişkenler herhangi bir sırada ayrı ayrı veya birleştirilmiş olarak belirtilebilir./EH arguments may be specified separately or combined, in any order. Aynı bağımsız değişkenin birden fazla örneği belirtilirse, son bir daha önceki olanları geçersiz kılar.If more than one instance of the same argument is specified, the last one overrides any earlier ones. Örneğin, ile /EHr- /EHc /EHs aynıdır /EHscr- ve /EHscr- /EHr aynı etkiye sahiptir /EHscr .For example, /EHr- /EHc /EHs is the same as /EHscr-, and /EHscr- /EHr has the same effect as /EHscr.

AçıklamalarRemarks

Varsayılan özel durum işleme davranışıDefault exception handling behavior

Derleyici zaman uyumsuz yapılandırılmış özel durum işlemeyi () destekleyen bir kod üretir SEH .The compiler always generates code that supports asynchronous structured exception handling (SEH). Varsayılan olarak (yani,, /EHsc /EHs veya /EHa seçeneği belirtilmişse), derleyici SEH Yerel C++ catch(...) yan tümcesindeki işleyicileri destekler.By default (that is, if no /EHsc, /EHs, or /EHa option is specified), the compiler supports SEH handlers in the native C++ catch(...) clause. Ancak, C++ özel durumlarını yalnızca kısmen destekleyen kodu da oluşturur.However, it also generates code that only partially supports C++ exceptions. Varsayılan özel durum geriye doğru izleme kodu, try özel bir durum nedeniyle kapsam dışına çıkan blokların dışındaki otomatik C++ nesnelerini yok etmez.The default exception unwinding code doesn't destroy automatic C++ objects outside of try blocks that go out of scope because of an exception. C++ özel durumu n olduğunda kaynak sızıntıları ve tanımsız davranış ortaya çıkabilir throw .Resource leaks and undefined behavior may result when a C++ exception is thrown.

Standart C++ özel durum işlemeStandard C++ exception handling

Standart C++ özel durum işleme modeli için, güvenli bir şekilde yığın nesneleri gerektiren /EHsc (önerilen), veya için tam derleyici desteği /EHs /EHa .Full compiler support for the Standard C++ exception handling model that safely unwinds stack objects requires /EHsc (recommended), /EHs, or /EHa.

/EHs Veya kullanıyorsanız /EHsc , catch(...) yan tümcelerinizi catch zaman uyumsuz yapılandırılmış özel durumlar değildir.If you use /EHs or /EHsc, then your catch(...) clauses don't catch asynchronous structured exceptions. Tüm erişim ihlalleri ve yönetilen System.Exception özel durumlar yakalanamayan.Any access violations and managed System.Exception exceptions go uncaught. Ve, zaman uyumsuz özel durum oluştuğunda kapsamdaki nesneler, kod uyumsuz özel durumu işlese bile yok edilmez.And, objects in scope when an asynchronous exception occurs aren't destroyed, even if the code handles the asynchronous exception. Bu davranış, yapılandırılmış özel durumların işlenmemiş bırakılması için bir bağımsız değişkendir.This behavior is an argument for leaving structured exceptions unhandled. Bunun yerine, bu özel durumları önemli değerlendirin.Instead, consider these exceptions fatal.

/EHs Veya kullandığınızda /EHsc , derleyici özel durumların yalnızca bir throw ifadede veya bir işlev çağrısında gerçekleşebileceğini varsayar.When you use /EHs or /EHsc, the compiler assumes that exceptions can only occur at a throw statement or at a function call. Bu varsayım, derleyicinin, kod boyutunu önemli ölçüde azaltan birçok nesnenin ömrünü izlemeye yönelik kodu ortadan kaldırmasına olanak tanır.This assumption allows the compiler to eliminate code for tracking the lifetime of many unwindable objects, which can significantly reduce code size. Kullanırsanız /EHa , derleyici blokları kararlılık olarak iyileştirmediği için yürütülebilir görüntünüz daha büyük ve daha yavaş olabilir try .If you use /EHa, your executable image may be larger and slower, because the compiler doesn't optimize try blocks as aggressively. Derleyici C++ özel durumu ile ilgili herhangi bir kodu görmese de, yerel nesneleri otomatik olarak temizleyen özel durum filtrelerinde de kalır throw .It also leaves in exception filters that automatically clean up local objects, even if the compiler doesn't see any code that can throw a C++ exception.

Yapılandırılmış ve standart C++ özel durum işlemeStructured and standard C++ exception handling

/EHa Derleyici seçeneği, hem zaman uyumsuz özel durumlar hem de C++ özel durumları için güvenli yığın geri sarma özelliğini sunar.The /EHa compiler option enables safe stack unwinding for both asynchronous exceptions and C++ exceptions. Yerel C++ yan tümcesini kullanarak hem standart C++ hem de yapılandırılmış özel durumların işlenmesini destekler catch(...) .It supports handling of both standard C++ and structured exceptions by using the native C++ catch(...) clause. Belirtmeden uygulamak için,, SEH /EHa __try __except ve __finally sözdizimini kullanabilirsiniz.To implement SEH without specifying /EHa, you may use the __try, __except, and __finally syntax. Daha fazla bilgi için bkz. yapılandırılmış özel durum işleme.For more information, see Structured exception handling.

Önemli

/EHa try Kullanarak tüm özel durumları işlemek için belirtme ve kullanma catch(...) tehlikeli olabilir.Specifying /EHa and trying to handle all exceptions by using catch(...) can be dangerous. Çoğu durumda, zaman uyumsuz özel durumlar kurtarılamaz olarak kabul edilir ve önemli olarak düşünülmelidir.In most cases, asynchronous exceptions are unrecoverable and should be considered fatal. Onları yakalamak ve devam etmek, işlemin bozulmasına neden olarak bulunması ve giderilmesi zor olan hatalara yol açabilir.Catching them and proceeding can cause process corruption and lead to bugs that are hard to find and fix.

Windows ve Visual C++ desteklese de SEH , ISO standardı C++ özel durum işleme (veya) kullanmanızı önemle öneririz /EHsc /EHs .Even though Windows and Visual C++ support SEH, we strongly recommend that you use ISO-standard C++ exception handling (/EHsc or /EHs). Kodunuzu daha taşınabilir ve esnek hale getirir.It makes your code more portable and flexible. SEHEski kodda veya belirli türde programlar için kullanmak istediğiniz zamanlar olabilir.There may still be times you have to use SEH in legacy code or for particular kinds of programs. Örneğin, ortak dil çalışma zamanını () desteklemek için derlenen kodda gereklidir /clr .It's required in code compiled to support the common language runtime (/clr), for example. Daha fazla bilgi için bkz. yapılandırılmış özel durum işleme.For more information, see Structured exception handling.

Kullanılarak derlenen nesne dosyalarını /EHa , veya kullanılarak derlenenlere /EHs /EHsc aynı yürütülebilir modülde bağlamayın.We recommend that you never link object files compiled using /EHa to ones compiled using /EHs or /EHsc in the same executable module. Modülünüzün herhangi bir yerini kullanarak zaman uyumsuz bir özel durumu işlemeniz gerekiyorsa /EHa , /EHa modüldeki tüm kodu derlemek için kullanın.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. Kullanılarak derlenen kodla aynı modülde yapılandırılmış özel durum işleme sözdizimini kullanabilirsiniz /EHs .You can use structured exception handling syntax in the same module as code that's compiled by using /EHs. Ancak, SEH sözdizimini C++ try , throw , ve ile aynı işlevde karıştıramazsınız catch .However, you can't mix the SEH syntax with C++ try, throw, and catch in the same function.

' /EHa catch Den başka bir şey tarafından oluşturulan bir özel durum istiyorsanız kullanın throw .Use /EHa if you want to catch an exception that's raised by something other than a throw. Bu örnek, catch yapılandırılmış bir özel durum oluşturur ve geliştirir: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;
    }
}

/Clr altında özel durum işlemeException handling under /clr

/clr Seçeneği (yani /EHa , /clr /EHa gereksizdir) anlamına gelir.The /clr option implies /EHa (that is, /clr /EHa is redundant). Derleyici, /EHs veya sonrasında kullanıldığında bir hata oluşturur /EHsc /clr .The compiler generates an error if /EHs or /EHsc is used after /clr. İyileştirmeler Bu davranışı etkilemez.Optimizations don't affect this behavior. Bir özel durum yakalandığında, derleyici özel durumla aynı kapsamda olan herhangi bir nesne için sınıf yıkıcıları çağırır.When an exception is caught, the compiler invokes the class destructors for any objects that are in the same scope as the exception. Bir özel durum yakalanmazsa, bu yok ediciler çalıştırılmaz.If an exception isn't caught, those destructors aren't run.

Altında özel durum işleme kısıtlamaları hakkında daha fazla bilgi için /clr bkz. _set_se_translator.For information about exception handling restrictions under /clr, see _set_se_translator.

Çalışma zamanı özel durum denetimleriRuntime exception checks

/EHr Seçeneği özniteliği olan tüm işlevlerde çalışma zamanı sonlandırma denetimlerini zorlar noexcept .The /EHr option forces runtime termination checks in all functions that have a noexcept attribute. Varsayılan olarak, derleyici arka ucu bir işlevin yalnızca *yapmayan throw * işlevleri çağırdığını belirlerse, çalışma zamanı denetimleri en iyi duruma getirilebilir.By default, runtime checks may be optimized away if the compiler back-end determines that a function only calls non-throwing functions. Olmayan throw İşlevler, hiçbir özel durum belirten bir özniteliği olan işlevlerdir, throw n olabilir.Non-throwing functions are any functions that have an attribute that specifies no exceptions may be thrown. ,,, Ve belirtildiğinde işlevleri,,, noexcept throw() __declspec(nothrow) ve /EHc extern "C" işlevleri içerir.They include functions marked noexcept, throw(), __declspec(nothrow), and, when /EHc is specified, extern "C" functions. Yerleşik olmayan throw İşlevler, derleyicinin İnceleme tarafından belirlenebileceği tüm özellikleri de içerir throw .Non-throwing functions also include any that the compiler has determined are non-throwing by inspection. Kullanarak varsayılan davranışı açık bir şekilde ayarlayabilirsiniz /EHr- .You can explicitly set the default behavior by using /EHr-.

Olmayan bir throw öznitelik, özel durumların throw bir işlev tarafından n olamaz.A non-throwing attribute isn't a guarantee that exceptions can't be thrown by a function. Bir işlevin davranışının aksine, noexcept MSVC derleyicisi,, throw throw() __declspec(nothrow) veya tanımsız davranışlar kullanılarak belirtilen bir işlev tarafından n özel durumunu değerlendirir extern "C" .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. Bu üç bildirim özniteliğini kullanan işlevler, özel durumlar için çalışma zamanı sonlandırma denetimlerini zorlamaz.Functions that use these three declaration attributes don't enforce runtime termination checks for exceptions. /EHr Bu tanımsız davranışı belirlemenize yardımcı olması için, derleyicinin bir işlev kaçış işlenmemiş özel durumlar için çalışma zamanı denetimleri oluşturmasını zorlayarak Bu tanımsız davranışı tanımlamanızı sağlayabilirsiniz noexcept .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.

Visual Studio veya program aracılığıyla seçeneği ayarlamaSet the option in Visual Studio or programmatically

Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak içinTo set this compiler option in the Visual Studio development environment

  1. Projenin Özellik sayfaları iletişim kutusunu açın.Open the project's Property Pages dialog box. Ayrıntılar için bkz. Visual Studio 'Da C++ derleyicisini ve derleme özelliklerini ayarlama.For details, see Set C++ compiler and build properties in Visual Studio.

  2. Yapılandırma özellikleri > C/C++ > kod üretimi' ni seçin.Select Configuration Properties > C/C++ > Code Generation.

  3. C++ özel durumlarını etkinleştir özelliğini değiştirin.Modify the Enable C++ Exceptions property.

    İsterseniz, C++ özel durumlarını etkinleştir ' i Hayırolarak ayarlayın ve ardından komut satırı özellik sayfasındaki ek seçenekler kutusunda derleyici seçeneğini ekleyin.Or, set Enable C++ Exceptions to No, and then on the Command Line property page, in the Additional Options box, add the compiler option.

Bu derleyici seçeneğini program üzerinden ayarlamak içinTo set this compiler option programmatically

Ayrıca bkz.See also

MSVC derleyici seçenekleriMSVC Compiler options
MSVC derleyici komut satırı sözdizimiMSVC Compiler command-line syntax
Hatalar ve özel durum işlemeErrors and exception handling
Özel durum belirtimleri ( throw )Exception specifications (throw)
Yapılandırılmış Özel Durum İşleme (C/C++)Structured Exception Handling (C/C++)