-
05-07-2019 - |
题
我正在尝试这段代码来检查是否捕获了除以零异常:
int main(int argc, char* argv[])
{
try
{
//Divide by zero
int k = 0;
int j = 8/k;
}
catch (...)
{
std::cout<<"Caught exception\n";
}
return 0;
}
当我使用 VC6 编译此代码时,catch 处理程序被执行,输出为“捕获异常”。然而,当我使用 VS2008 编译这个程序时,程序在没有执行 catch 块的情况下崩溃了。造成差异的原因可能是什么?
解决方案
在项目下启用结构化异常处理 - &gt;属性 - &gt;配置属性 - &gt; c / c ++ - &gt;代码生成 - &gt;启用c ++异常。
使用try除外。理想情况下,使用过滤器检查异常代码,然后返回常量信号,如果它想要捕获。我已经跳过了这里,但我建议你看看这里用于过滤器的示例。
#include <iostream>
#include <windows.h>
int main(int argc, char* argv[])
{
__try
{
//Divide by zero
int k = 0;
int j = 8/k;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
std::cout << "Caught int divison exception\n";
else
std::cout << "Caught exception\n";
system("pause");
}
return 0;
}
其他提示
您正在捕获由 Microsoft 的结构化异常处理 (SEH) 层生成的异常,该层是 Microsoft 特有的操作系统事物。正如 Mykola 所建议的,您可能需要摆弄编译器选项,但请注意,此代码将无法移植到其他操作系统,甚至无法移植到 Windows 上运行的其他编译器。
转到项目属性,在“C/C++”、“代码生成”下,您将找到“启用 C++ 异常”。将此选项更改为“是,有 SEH 例外”
请注意,您只能使用以下任一方法捕获此类异常:
try {} catch(...) {}
(带省略号)__try {} __except() {}
(在适当的过滤器__except
)- 通过使用
SetUnhandledExceptionFilter()
对于有效值 __except
看这里
在Visual Studio中,它可以是编译器选项。 但按标准来说,不会抛出异常。
不隶属于 StackOverflow