|
你的应用程序的异常处理模型决定了它是否可以捕获和传输异常。 Visual C++ 支持三种处理 C++ 异常的模型:ISO 标准 C++ 异常处理、结构化异常处理 (SEH),以及公共语言运行时 (CLR) 异常。 使用/EH和/clr编译器选项以指定应用程序的异常处理模型。
只有编译器选项和编程语句的以下组合可以传输异常。 其他组合要么不能捕获异常,要么能捕获但不能传输异常。
/EHa编译器选项与catch语句可以传输 SEH 和 C++ 异常。
/EHa、/EHs和/EHsc编译器选项与catch语句可以传输 C++ 异常。
/clr编译器选项与catch语句可以传输 C++ 异常。 /clr编译器选项表示/EHa选项的规范。 编译器不支持传输托管异常。 这是因为,从System.Exception 类派生的托管异常已经是可使用公共语言运行时工具在线程间移动的对象。
重要
建议指定/EHsc编译器选项并仅捕获 C++ 异常。 如果使用/EHa或/clr编译器选项和含有省略号异常声明 (catch(...))的catch语句,就可能面临安全威胁。 你可能希望使用 catch 语句捕获几个特定的异常。 但是,catch(...) 语句将捕获所有的 C++ 和 SEH 异常,包括致命的意外异常。 如果忽略意外异常或处理不当,恶意代码就可以趁此机会破坏你程序的安全性。
|
|