2014-09-11 4 views
1

라이브러리에서 예외를 throw하면 예외가 호출자에 의해 catch되지 않습니다. 라이브러리 간의 C++ std :: 예외

내가 정적 라이브러리에서이 기능이있는 경우, 설명하기 :

#include <exception> 

void TestClass::ThrowException() 
{ 
    throw new std::exception(); 
} 

을 ... 그리고 실행에서 호출 :

TestClass t; 
try 
{ 
    t.ThrowException(); 
} 
catch (std::exception e) 
{ 
} 
catch (...) 
{ 
} 

... 그것은 두 번째 캐치입니다 그 예외를받습니다. 첫 번째가 아니라 제가 기대하지 않은 예외입니다. 나는 인식하지 못하는 예외 유형을 야기하는 라이브러리들 사이에 어떤 마샬링이 있다고 생각합니다.

2 개의 바이너리간에 예외를 전달하여 호출자가 'std :: exception'으로 인식 할 수 있습니까? 이차적 인 질문으로, 이것은 좋은 생각입니까?

Visual Studio에서 작업하면서 Windows를 대상으로합니다.

+0

저는 관리되는 (C#) 배경에서 왔습니다. 그래서 여기에서 무슨 일이 일어나고 있는지, 그리고 C++의 모범 사례는 무엇인지 더 깊이 이해하고 싶습니다. –

+0

'catch (std :: exception e)'대신'catch (std :: exception & e)'를 시도하십시오. – Arkady

+5

두 번째로 살펴보면 포인터가 될'throw new'를 볼 수 있습니다. [C++ 예외 발생 방법] (http://stackoverflow.com/questions/8480640/how-to-throw-a-c-exception)을 참조하십시오. 다른 말로하면 C#에서'new'를 사용하는 곳이 많기 때문에 C++에서도 같은 것을하지 않을 것입니다. – crashmstr

답변

3
throw new std::exception(); 

당신은 힙에 생성 한 예외를 던지고있다, 그래서 당신은 포인터로 잡을 필요

catch (std::exception *e) 

그러나 어느 것을에게 (당신이 알고하지 않습니다하지 않는 할당 된 메모리를 삭제하십시오). 대신 스택에 객체를 던지십시오.

throw std::exception(); 

마지막 포인트. 값으로 잡아 내지 말고 참조로 잡으십시오. 이는 나중에 예외를 서브 클래 싱 할 때 나중에 슬라이스하지 않기 때문입니다. 당신이 const를 참조로 완전히 올바른 잡을 수 싶다면 :

catch (const std::exception& e) 

이 모든 새로운 경우

독서는 효과는 C++과 스콧 마이어스에 의해 속편 추천.

+0

분명한 답변을 보내 주셔서 감사 드리며 독서를 권장합니다. C++에서 예외를 throw하는 방법에 대한 내 이해가 기반을 벗어났습니다. –

관련 문제