2010-04-22 6 views
0

Visual Studio 2008 C++에서 이상한 상황이 있습니다. 나는 원래 Visual Studio 2003 용으로 작성된 코드를 사용하는데 모든 것이 잘 작동한다. 현재 VS 2008로 포팅 된이 코드에서는 불행히도 널리 존재하지 않는 예외 처리가 더 이상 작동하지 않습니다. 표준 코드 예제 : VS 2008에서HRESULT 예외가 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 
} 

는, 예외가 발생하지 않습니다,하지만 난 스택 포인터가 망해야한다는, 다른 곳에서 충돌을 얻을. 아무도이 행동을 보지 못했습니까? 어떤 도움을 주셔서 감사합니다.

+0

VS2009와 같은 것은 없습니다. 2008 년 태그와 일치하도록 질문을 편집했습니다. 새 2010 버전을 언급하는 경우 질문을 편집하여이를 나타냅니다. –

+1

'throw hr;'줄에 중단 점을두면 중단 점에 충돌합니까? –

+0

내가 해체했을 때, 어딘가에 "Microsoft C++ 예외 : 메모리 위치가 0x0016c814가된다"라고 말하는 디스 어셈블리가 발생했습니다. – arionik

답변

1

디버거를 시작한 후 디버그/예외로 이동하여 예외가 발생할 때 디버거가 중지되어야하는 예외를 선택합니다.

+0

내 어리 석음이 내 자신을 우연히 만났습니다. 디버거가 catch 범위 내에서 멈추지 않는다고 너무 나쁘다. – arionik

1

다른 곳에서 충돌이 발생하여 스택 포인터가 망가져 야 함을 나타냅니다.

어떻습니까? 충돌의 사실은 스택과 관련이 없습니다. 더 큰 문제는 "hr"이 무엇으로 선언되었는지 알 수 없다는 것입니다. HRESULT 이외의 다른 것으로 선언 되었다면, 컴파일러는 거기에 붙잡을 필요가 없습니다.

특히 HRESULT의 정의가 64 비트 창을 지원하기 위해 VS2005에서 변경되었다고 생각합니다. 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

+0

: 그러면 우리가 볼 필요가 있습니다. 더 많은 코드. –

+0

코드가 VS2008에서 잘 작동합니다 ... 내 추측은 그 이유가 무엇이든 던지지 않는 것입니다. – Goz

관련 문제