2010-04-28 9 views
4

QT 및 많은 타사 라이브러리를 기반으로하는 응용 프로그램이 있습니다. 이것들은 몇 가지 예외를 던지기도합니다.Qt/C++ 이벤트 루프 예외 처리

기본 Qt 응용 프로그램에서 이로 인해 응용 프로그램이 중단되거나 종료됩니다. 종종 외부 데이터가없는 순수한 Qt를 유지하면서 주 데이터 모델은 그대로 유지됩니다.

그래서 나는이 프로세스에서 오류가 발생했다는 것을 사용자에게 알리는 것으로 복구 할 수 있다고 생각합니다. 지금 저장하거나 주 모델에서 계속 작업하기로 결정해야합니다.

현재이 프로그램은 이야기를 말하지 않고도 자동으로 종료됩니다.

+0

나는 당신이 무엇을 요구하고 있는지 이해하지 못한다고 생각합니다. 어딘가에 Qt와 다른 라이브러리 간의 상호 작용을 처리하는 코드가 있어야합니다. 오류 처리 및 복구를 수행하십시오. (예, 그것이 많은 곳이 될 수도 있음을 알고 있습니다.) –

+0

HI Caleb, 당신의 위탁에 감사드립니다, 나는 이것을 시도했지만 다른 lib는 예외를 넘기 전에 프로그램을 중단하고 죽입니다. 그동안 예외가 발생할 때마다 복구중인 예외 핸들러를 설치했습니다. 불행히도 제 3 자 lib는 즉시 중단하기 전에 예외를 잡는 것 같습니다. 디버거는 제 3 자 코드에서 액세스 위반에 대해서만 알려줍니다. – Georg

+0

@Georg, 당신은 아마 그것을 지금 이해했을 것입니다. 같은 문제가있는 다른 사람들을 위해 게시하고 있습니다. C++에서 액세스 위반 및 0으로 나누기 예외를 throw하지 마십시오 (적어도 정상적으로). 이 두 종류의 오류 중 하나가 발생하자마자 프로그램이 종료됩니다. –

답변

5

Qt 설명서 here에 명시된 바와 같이 Qt는 현재 완전히 예외 안전하지는 않습니다. 이 페이지의 "예외로부터 복구하기"섹션은 예외가 발생했을 때 Qt 애플리케이션에서 수행 할 수있는 유일한 작업을 설명합니다. 즉, 애플리케이션을 정리하고 종료합니다.

예외가 발생하는 타사 라이브러리를 사용하는 경우 외부 라이브러리와 Qt 코드의 경계에서이를 catch하고 거기에서 처리해야합니다 (Caleb의 설명에 명시된 바와 같이). 오류가 Qt 애플리케이션으로 전파되어야하는 경우 오류 코드를 반환하거나 (가능한 경우) 이벤트를 게시하여 수행해야합니다.

+0

귀하의 의견을 보내 주셔서 감사합니다, 나는 QApplication :: 통지()를 remimplented하고 모든 것을 잡아. 앱이 단순히 종료되지는 않지만 사용자가 적어도 현재 데이터를 저장할 수 있으므로이 기능은 상당히 유용합니다. 내 코드에서 예외 std :: bad_alloc 등을 던져서 테스트했습니다. 또한 try {} catch (...) 내부에서 제 3 자 lib 코드를 호출하지만 아무 일도 일어나지 않아 앱이 충돌합니다. – Georg

5

때로는 모든 예외를 잡는 것이 정말 어렵습니다. 실수로 한 가지 예외가 발생하면 다음과 같이 많은 도움이됩니다. 그런 다음 사용자 정의 클래스하여 main() 함수에서 QApplication을 대체 QApplication에서 상속 및 다음과 같은 방법

bool MyApplication::notify( 
QObject * receiver, 
QEvent * event) 
{ 
    try 
    { 
     return QApplication::notify(receiver, event); 
    } 
    catch(...) 
    { 
     assert(!"Oops. Forgot to catch exception?"); 

     // may be handle exception here ... 
    } 

    return false; 
} 

notify() 기능을 재정의합니다. 모든 eventsslots이이 기능을 통해 발행되므로 모든 예외 사항이 발견되어 응용 프로그램이 안정됩니다.