在catch块中调用GetLastError会产生不正确的值

GetLastError called in a catch block yields incorrect value

本文关键字:不正确 GetLastError catch 调用      更新时间:2023-10-16

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

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!为什么呢?函数实际上比这个更复杂。它们确实包括堆栈上的一些东西(DWORDs, CString, BYTE[])。我应该找什么?

日志如下:

Log1: 1

Log2: 0

MSVC编译器和运行时中的c++异常构建在本地Windows SEH之上。堆栈展开实际上是由Windows执行的。使用Windows api函数将影响为GetLastError()存储的值。