在下面的代码中,函数
这里的期望输出应该是:
foo
递归调用了一次。内部调用导致引发访问冲突异常。外部调用捕获了该异常。#include <windows.h>
#include <stdio.h>
void foo(int cont)
{
__try
{
__try
{
__try
{
if (!cont)
*(int *)0 = 0;
foo(cont - 1);
}
__finally
{
printf("inner finally %d\n", cont);
}
}
__except (!cont? EXCEPTION_CONTINUE_SEARCH: EXCEPTION_EXECUTE_HANDLER)
{
printf("except %d\n", cont);
}
}
__finally
{
printf("outer finally %d\n", cont);
}
}
int main()
{
__try
{
foo(1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("main\n");
}
return 0;
}
这里的期望输出应该是:
inner finally 0
outer finally 0
inner finally 1
except 1
outer finally 1
但是,真实输出中明显缺少outer finally 0
。这是一个bug还是我忽略了一些细节?
为了完整起见,使用VS2015编译x64时会发生这种情况。令人惊讶的是,它在x86上不会发生,这导致我认为这真的是一个bug。
RaiseException
抛出异常,行为是完全一样的。 - avakar