2011-10-27 2 views
1

내가 등록한 세 개의 핸들러를 처리 : - 국외 거주자 파서 - C++ -Exception 해외 거주자 파서

그리고 메인 프로그램에서

, 나는 XML 파일을 읽어 텍스트, 그것을 버퍼 및 호출 XML_Parse API - -end 시작 . 이 같은 뭔가가 :

try { 
if(! XML_Parse (....)) 
{ 
    // throw user-defined expection here 
} 
catch(...) 
{ 
} 
} // end of try 
catch(...) 
{ 
} 

XML_Parse 실패에 0을 반환하는 경우, 예외가 내부의 경우에서 발생되고있다. 그리고 이너 캐치 블록에 걸렸습니다.

여기 내 질문 : 구문 분석하는 동안 처리기 중 하나에서 사용자 정의 예외가 throw 된 경우 외부 catch에 catch됩니까?

그렇다면 실제로 코드에서 발생하지 않습니다. 대신 던져 버리는 코어 및 스택 쇼를 덤프하고 std : terminate로 연결합니다. HANDLERS로부터 예외를 던지기 전에 다른 작업을 수행해야합니까?

감사합니다.

답변

0

당신은 trycatch 사이에 불일치가 각 try 블록은 적어도 하나의 catch 블록 다음에,하지만 당신은 하나의 try이된다. 어쩌면이 같은 : 익명 catch(...)은 일반적으로 아주 좋은 디자인 아니라고

try 
{ 
    // stuff before 

    try 
    { 
    if (!parse()) 
    { 
     // ... 
    } 
    } 

    // further catch blocks? 

    catch(...) 
    { 
    // may rethrow 
    } 

    // stuff after 
} 

주 - 당신이 기대하는 것을 알고 처리 할 수 ​​있습니다, 또는 당신이 그것을 잡을 필요가 없습니다 중 하나. 익명 캐치에 대한 유일한 유용한 정보는 예외를 기록하고 다시 범하는 것입니다.

+0

죄송합니다. 이너 캐치가 없습니다. try 다음에 하나의 catch가 있습니다. 따라서 예외가 발생할 수있는 곳은 두 곳입니다. 하나는 안쪽에서, 다른 하나는 HANDLERS에서. 그렇다면 HANDLERS에서 예외가 발생할 때 어떻게 작동합니까? –

+0

그리고 더 많은 익명 캐치는 문제를 설명하기위한 것입니다. 던져진 객체를 처리하는 올바른 catch 블록이 있습니다. 내 주요 관심사는 HANDLERS가 예외를 던지면 어떻게 될 것입니까? –

0

try{/*stuff*/} 블록에서 예외를 throw하고 throw이 깊이 중첩 된 경우 스택은 일치하는 외부 catch(...) 함수 끝까지 푸십시오. 처리기가 힙 메모리를 할당 한 경우 shared_ptr<>을 사용하거나 명시 적으로 삭제하고 을주의하여으로 처리해야합니다. 처리기가 try 블록 안에 있으면 예외가 정상적으로 작동해야합니다.

0

매우주의해야합니다. (일부 코드에서는 문제를 추적하기가 어려웠습니다.) 필자가 사용해야하는 expat 라이브러리는 gcc에서 필요한 예외 플래그를 사용하여 빌드되지 않았으며 expat는 C (C++이 아닌)이므로 예외를 처리 할 수있는 방법을 알지 못했습니다. .

그러나 올바른 gcc 플래그로 expat을 빌드 할 수 있으면 모든 것이 정상입니다. (재구성 expat은 나를 위해 가능하지 않았기 때문에 대신 libxml2를 사용하여 DOM 파싱으로 전환했습니다.)