【发布时间】:2016-08-25 06:17:08
【问题描述】:
我正在学习示例,但我不是
#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {
puts("in filter.");
if (code == EXCEPTION_ACCESS_VIOLATION) {
puts("caught AV as expected.");
return EXCEPTION_EXECUTE_HANDLER;
}
else {
puts("didn't catch AV, unexpected.");
return EXCEPTION_CONTINUE_SEARCH;
};
}
int main()
{
int* p = 0x00000000; // pointer to NULL
puts("hello");
__try {
puts("in try");
__try {
puts("in try");
*p = 13; // causes an access violation exception;
}
__finally {
puts("in finally. termination: ");
puts(AbnormalTermination() ? "\tabnormal" : "\tnormal");
}
}
__except (filter(GetExceptionCode(), GetExceptionInformation())) {
puts("in except");
}
puts("world");
}
程序的输出是:
hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
abnormal
in except
world
我很困惑为什么它会先过滤,然后再过滤,然后打印“in except”。 如果它转到 __except 是不是这样,它应该完成执行。
【问题讨论】:
-
如果要求 c++ 代码,请使用 c++ 标准语法,否则在此处放置另一个标签。
-
不确定是否可以在同一个函数中嵌套两个
__try。值得一试。 -
谢谢你们.. 只是通过阅读 __try 定义我认为它与 try catch 类似
-
@Cheersandhth.-Alf 看起来像初学者的代码,但这个例子是从 MSDN 的文档中逐字复制的。
-
SEH 未尝试供应商锁定。操作系统需要一个与 C++ 没有任何关系的异常处理机制。一方面,C++ 异常还没有被发明出来。另一方面,操作系统不是用 C++ 编写的。第三,C++ 异常处理机制需要运行时支持,这显然需要操作系统或某人来编写代码。 Windows 使用 SEH。它比 C++ 规范定义的异常处理功能强大得多,并且可以捕获常规 try/catch 无法捕获的错误。 FUD 没有建设性。