0

我在 Visual Studio 2008 C++ 中遇到了一个奇怪的情况。我编写的代码最初是为 Visual Studio 2003 编写的,一切运行良好。现在,移植到 VS 2008,不幸的是,在代码中广泛存在的异常处理不再起作用。标准代码示例:

 try
 {
      HRESULT hr = S_OK;
      // do stuff...
      if( FAILED( hr ) ) 
          throw hr;
 }
 catch( HRESULT hr )
 {
      // error handling, but we never get here
 }
 catch( ... )
 {
      // ... not even here
 }

在VS 2008下,没有遇到异常,但是我在别的地方遇到了crash,说明堆栈指针一定是搞砸了。有人遇到过这种行为吗?任何帮助表示赞赏。

4

2 回答 2

1

启动调试器后,转到 Debug / Exceptions,并选择在抛出异常时调试器应该停止哪些异常。

于 2010-04-22T15:06:05.690 回答
1

我在其他地方发生了崩溃,表明堆栈指针必须搞砸了。

怎么会这样?崩溃的事实与堆栈无关。这里更大的问题是我们不知道“hr”被声明为什么。如果它被声明为 HRESULT 以外的任何东西,编译器不需要在那里捕获。

具体来说,我相信 HRESULT 的定义随着 VS2005 的变化而改变,以支持 64 位窗口。如果 hr 被声明为之前恰好与 HRESULT 相同的其他内容,但不是在您安装新的 Windows SDK 之后,那么这可能是一个原因。

没有看到更多代码就不能说更多。

编辑:以下工作正常:

#include <iostream>
#include <iomanip>
#include <windows.h>

int main()
{
    try
    {
        HRESULT hr = E_FAIL;
        std::cout << "Inside try\r\n";
        if( FAILED( hr ) ) 
            throw hr;
    }
    catch( HRESULT hr )
    {
        std::cout << "Error:" << std::hex << (unsigned int)hr;
    }
    system("pause > nul");
}

我们需要查看更多代码。

于 2010-04-22T14:24:58.030 回答