异常捕获--编译开关EHsc、EHa、EHs_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 异常捕获--编译开关EHsc、EHa、EHs

异常捕获--编译开关EHsc、EHa、EHs

 2013/8/10 20:58:04  aigo  程序员俱乐部  我要评论(0)
  • 摘要:官方介绍地址http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx参数说明aTheexception-handlingmodelthatcatchesasynchronous(structured)andsynchronous(C++)exceptions.sTheexception
  • 标签:编译 异常捕获 异常

?

官方介绍地址

http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

参数说明

a

The exception-handling model that catches asynchronous(structured) and synchronous (C++) exceptions.

s

????The exception-handling model that catchesC++ exceptions only and tells the compiler to assume that?extern?C functions do throw an exception.

c

????If used with?s?(/EHsc), catches C++ exceptionsonly and tells the compiler to assume that?extern?C functions never throw a C++ exception.?/EHca?is equivalent to?/EHa.

?

官方说明如下:

Use?/EHs?to specify the synchronous exceptionhandling model (C++ exception handling without structured exception handlingexceptions). If you use?/EHs,then your catch clause will not catch asynchronous exceptions. Also, in VisualC++ 2005, all objects in scope when the asynchronous exception is generatedwill not be destroyed even if the asynchronous exception is handled. Under?/EHs,?catch(...)?will only catch C++ exceptions. Accessviolations and?System.Exception?exceptionswill not be caught.

Use?/EHa?to specify the asynchronous exceptionhandling model (C++ exception handling with structured exception handlingexceptions).?/EHa?may result in a less performant imagebecause the compiler will not optimize a catch block as aggressively, even ifthe compiler does not see a throw.

Use?/EHa?if you want to catch an exceptionraised with something other than a throw. The following sample will generate anexception:

class="cpp" name="code">// 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).
   }
   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;
   }
}

?

?

The?/EHc?option requires that?/EHs?or?/EHa?is specified. Using?/clr (CommonLanguage Runtime Compilation)?implies?/EHa?(/clr /EHa?is redundant). The compiler willgenerate an error if/EHs[c]?isused after?/clr.Optimizations will not affect this behavior. When an exception is caught, thecompiler invokes the class destructor or destructors for the object or objectsthat are in the same scope as the exception. When an exception is not caught,those destructors are not run.

See?_set_se_translator?forexception handling restrictions under?/clr.

The option can be cleared by the symbol?-. For example,?/EHsc-?is interpreted as?/EHs /EHc-?and is equivalent to?/EHs.

See?Exception Handling: Default Synchronous Exception Model?for more information.

To set this compiler option in the Visual Studio developmentenvironment

1.??????Open the project's?Property Pages?dialog box. For details, see?How to: OpenProject Property Pages.

2.??????Click the?C/C++?folder.

3.??????Click the?Code Generation?property page.

4.??????Modify the?Enable C++ Exceptions?property.

Alternately, you can use the following procedure:

To set this compiler option in the Visual Studio developmentenvironment

1.??????Click the?C/C++?folder.

2.??????Click the?Code Generation?property page.

3.??????Set?Enable C++ Exceptions?to?No.

4.??????Click the?Command Line?property page.

5.??????Type the compiler option inthe?Additional Options?box.

To set this compiler option programmatically

·????????See?ExceptionHandling.

发表评论
用户名: 匿名