在代码中捕获异常
Posted
技术标签:
【中文标题】在代码中捕获异常【英文标题】:Catching exception in code 【发布时间】:2009-03-08 10:28:57 【问题描述】:我正在尝试这段代码来检查是否被零除异常:
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 处理程序被执行并且输出是“Caught exception”。但是,当我使用 VS2008 编译它时,程序在没有执行 catch 块的情况下崩溃了。造成这种差异的原因可能是什么?
【问题讨论】:
【参考方案1】:在项目->属性->配置属性->c/c++->代码生成->启用c++异常下启用结构化异常处理。
使用尝试除外。理想情况下,使用检查异常代码的过滤器,如果它想捕获,则返回常量信号。我在这里跳过了它,但我建议您查看here 以获取过滤器的示例。
#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;
【讨论】:
TRUE
不是异常过滤器的有效值。看msdn.microsoft.com/en-us/library/s58ftw19(VS.80).aspx
它被隐式转换为 1 的相同常量并且编译和运行都很好。【参考方案2】:
您正在捕获由 Microsoft 的结构化异常处理 (SEH) 层生成的异常,这是一种特定于 Microsoft 的操作系统。正如 Mykola 建议的那样,您可能需要调整编译器选项,但请注意,此代码将无法移植到其他操作系统甚至 Windows 上运行的其他编译器。
【讨论】:
【参考方案3】:转到您的项目属性,在 C/C++,代码生成下,您将找到“启用 C++ 异常”。将此选项更改为“是,有 SEH 例外”
请注意,您只能使用以下任一方法捕获此类异常:
try catch(...)
(带省略号)
__try __except()
(__except
中有适当的过滤器)
通过使用SetUnhandledExceptionFilter()
对于__except
see here 中的有效值
【讨论】:
适当的过滤器适用于实际代码,但我在回答中将其简化为示例目的。【参考方案4】:在 Visual Studio 的情况下,它可以是编译器选项。 但按照标准,不会抛出异常。
【讨论】:
以上是关于在代码中捕获异常的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )
Kotlin 协程Flow 流异常处理 ( 收集元素异常处理 | 使用 try...catch 代码块捕获处理异常 | 发射元素时异常处理 | 使用 Flow#catch 函数捕获处理异常 )