2010-01-22 5 views
1

예외를 기록하려면 어떻게해야합니까? 지금은 catch 문에 메시지가 인쇄되어 있지만 왜 ins't Manage.Gere() sussefully라는 이해할 수 없습니다.C++ 예외를 기록하는 방법

try{ 
    Manager.Gere(&par,&Acc, coman, comando, RunComando, log, &parti, comandosS, RunComandosSuper,true); 
} 
catch (...) 
{ 
    log("ERROR ENTER GERE*****"); 
} 


Perif::Gere(CString *par, CString *Acc, HANDLE coman, HANDLE comando, HANDLE RunComando, Log &log, CString *parti, HANDLE comandosS, HANDLE RunComandosSuper,bool first) 
{ 
    log->LogD("Perif :: Gere Enter****** "); //It doesnt get printed 

} 
+0

달성하고자하는 것에 대한 자세한 정보를 추가 할 수 있습니까? 로그 (UNIX의 경우 windows?)에 예외를 작성 하시겠습니까? 아니면 메소드가 실패/실패하지 않는 이유를 알고 싶습니까? – csl

+0

관리가 클래스 이름으로 금지되어야합니다. –

+0

메서드가 실패한 이유를 이해하고 싶습니다. 해당 매개 변수에 문제가있을 수 있습니까? – Reversed

답변

0

가장 먼저 필요한 것은 Manage.Gere이 던질 수있는 예외를 찾습니다.
catch (구체적으로는 catch(FirstExceptionGereThrows &exc)) 가능한 모든 예외를 catch하면 Manage.Gere에서 무엇이 실패했는지 알 수 있습니다.

catch(FirstException &exc){ 
    log << "Failed because FirstException\n"; 
}catch(SecondException &exc){ 
    log << "Failed because SecondException\n"; 
} 

후, 당신은 당신이뿐만 아니라 로그인 할 수있는 충돌에 대한 몇 가지 추가 정보를 포함 할 수있다 Manage.Gere에 의해 던져진 예외 충분히 운이 좋다면.

catch(FirstException &exc){ 
    log << "Failed because FirstException: " << exc.what() << "\n"; 
} 
+0

Manage.Gere가 던질 수있는 예외를 어떻게 찾을 수 있습니까? Tks – Reversed

+0

문서화하거나 Manage.Gere 코드를 살펴보면 다른 방법은 없습니다. –

+1

예외가 std :: exception에서 파생 된 경우이를 잡아낼 필요가 없습니다. std :: exception을 catch하고 what() 멤버를 검사하십시오. –

2

잘 작동하는 API는 std::exception에서 파생 된 유형의 객체 만 내 보내야합니다. 그렇다면 예외에는 메시지가 포함 된 멤버 함수 const char *what()이 있습니다.이 메시지는 오류를 설명하는 데 도움이됩니다. 그래서 당신이 시도하고 도움이되기를 바랍니다 수 :

try { 
    Manage.Gere(...); 
} catch (const std::exception &e) { 
    log(e.what()); 
} catch (...) { 
    log("Manage.Gere threw unknown exception"); 
} 

그것은 std::exception 아닌 유형을 던졌습니다 경우에, 당신은 무엇을 볼 수있는 기능에 대한 문서 및/또는 소스에서 볼 필요가있을 것이다 잘못 될 수 있으며 어떤 유형을 던질 수 있습니다. 이 중 어느 것도 사용할 수 없다면, 나는 더 나은 라이브러리를 찾고있을 것입니다.

+0

그냥 코드를 시도하고 로그에 "Manage.Gere 알 수없는 예외가 던져"보여줬다 – Reversed

+0

그럼 던진 것은'std :: exception'의 하위 클래스가 아니 었습니다 ...어쩌면 그것은 사용자 정의 또는 라이브러리 정의 클래스이거나 'const char *'와 같은 기본 유형일까요? –

+0

Neil이 제안한 것처럼'const char *'와'const std :: string &'에 대한 핸들러를 추가 할 가치가 있을지도 모르며,'const CString &'(다른 문자열 클래스라고 생각합니다)도 추가 할 가치가 있습니다. 도움이되지 않으면 유일한 옵션은 함수에 대한 문서/소스를 읽는 것입니다. –

0

다른 사람들이 제안했듯이 RTFM이 실제로 답입니다. 또한 사용할 수 있습니다

try { 
    // stuff 
} 
catch(const char * s) { 
    cerr << s << endl; 
} 
catch(const std::string & s) { 
    cerr << s << endl; 
} 
// other catches here 
+0

문자열 이외에도 'throw int (errorCode)'가 많이 있으므로 이러한 정보도 잡으려고 할 가치가 있습니다. –

0

: 그래서 :: 문자열이 모두 CONST의 char *의 ANS의 표준을 잡으려고 노력 항상 가치가

if (something) { 
    throw "Something has happened!"; 
} 

: 그러나, 나는 게으른 프로그래머는 종종 코드처럼 쓸 것으로 나타났습니다 C++ 예외를 포착하고 자동으로 오프라인 디버깅을위한 미니 덤프 파일을 만드는 외부 디버거로 사용하는 도구입니다. 자세한 내용은 http://alax.info/blog/1211을 참조하십시오.

좋은 점은 코드를 필요로하지 않거나 코드가없는 응용 프로그램을 디버깅하거나 어떤 이유로 든 다시 작성할 수 없다는 것입니다. 덤프 파일은 스택 및 정보를 가져 오며 응용 프로그램은 계속 실행될 수 있습니다.

관련 문제