我在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下,没有遇到异常,但是我在其他地方遇到了崩溃,表明必须搞砸堆栈指针。有人遇到过这种行为吗?任何帮助表示赞赏。
答案 0 :(得分: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");
}
我们需要查看更多代码。
答案 1 :(得分:1)
启动调试器后,转到Debug / Exceptions,并选择调试器在抛出异常时应停止的异常。