0

今天探索一些遗留代码很有趣。碰到这个小数字:

function Func1()
{
DWORD dwError;
try
{
    dwError = 1;
    throw "Hey!";
} catch (LPCTSTR szError)
{
    Log("Log1: %d", dwError);
    SetLastError(dwError);
    throw szError;
}
}

function Func2()
{
    try {
       Func1();
    } 
    catch (LPCTSTR szError)
    {
         DWORD dwLastError = GetLastError();
         Log("Log2: %d", dwLastError); ///OMG is 0!
    }
}

GetLastError()返回0!这是为什么?这些功能实际上比这要复杂一些。它们确实在堆栈中包含了一些东西(DWORD、CString、BYTE[])。我应该寻找什么?

日志看起来像:

日志1:1

日志2:0

4

1 回答 1

2

MSVC 编译器和运行时中的 C++ 异常构建在本机 Windows SEH 之上。堆栈展开实际上是由 Windows 执行的。使用 Windows api 函数将影响为 GetLastError() 存储的值。有关此答案中与 SEH 连接的更多详细信息。

于 2011-09-15T22:17:11.173 回答