2010-04-22 51 views
0

我在Visual Studio 2008 C++中遇到了一个问题。我使用最初为visual studio 2003编写的代码,其中一切正常。现在,移植到VS 2008,异常处理在代码中广泛存在,不再适用。标准的代码示例:在VS 2008中没有捕获到HRESULT异常

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中,也不例外遇到,但我得到一个崩溃的其他地方,这表明堆栈指针必须被搞砸了。有人遇到过这种行为吗?任何帮助表示赞赏。

+0

有没有这样的事情VS2009。我编辑了您的问题以匹配您的标签,2008年。如果您指的是2010年新版本,请编辑您的问题以表明这一点。 – 2010-04-22 14:26:13

+1

如果你在'throw hr;'这一行放置了一个断点,你是否打断点? – 2010-04-22 14:47:45

+0

我确实打了它,之后它让我进入反汇编的地方,说“微软的C++ - 例外:长在内存位置0x0016c814” – arionik 2010-04-22 14:55:21

回答

1

启动调试器后,进入调试/例外,并选择调试器在抛出异常时应该停止的异常。

+0

我的愚蠢,刚刚碰到过我自己。太糟糕了,调试器不会停止在捕获范围内 – arionik 2010-04-22 16:59:28

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"); 
} 

我们需要看到更多的代码。

+0

它被声明为HRESULT,所以两个声明是相同的 - – arionik 2010-04-22 14:43:06

+0

@arionik:那么我们需要看看更多的代码。 – 2010-04-22 14:52:47

+0

你的代码在VS2008下也能正常工作......我的猜测是它不会因为某种原因而抛出 – Goz 2010-04-22 15:16:51