2010-01-22 118 views
1

你知道我該如何記錄異常嗎? 現在在catch語句中的消息被打印出來,但我不明白爲什麼不管理Manage.Gere()可疑地叫。如何記錄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)當你捕捉到所有可能的例外時,你就會知道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並檢查它的what()成員。 – 2010-01-22 11:40:22

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真的是答案。然而,我發現,懶惰的程序員經常編寫代碼,如:

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

所以它始終是值得一試的她倆都爲const char * ANS的std :: string:

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

您還可以使用我的工具作爲外部調試器,它捕獲C++異常並自動創建minidump文件以進行脫機調試。詳情請見http://alax.info/blog/1211

好處是你不需要任何代碼,或者你甚至可以調試你沒有代碼的應用程序,或者你不能以任何理由重建它。轉儲文件將爲您提供堆棧和信息,並且應用程序將能夠繼續執行。