2012-05-23 45 views
1

我有第三方C庫,它可以在CRT錯誤崩潰。在這種情況下整個過程崩潰。有什麼辦法可以捕捉到所有CRT錯誤並防止進程終止。如何防止CRT錯誤的進程崩潰C++

+0

檢查您使用的庫函數的輸入。檢查庫狀態((每線程)初始化?)。如果一切正常,請向圖書館供應商提出錯誤。 – sehe

+0

可能不是。如果你在Windows上,'__TRY'可能工作,或者Unix上的信號取決於確切的例外情況。它是什麼? – Rup

+0

http://msdn.microsoft.com/en-us/library/969zc1ac.aspx看起來像你是SOL(底層的第二個函數,不能這樣做)。 –

回答

4

防止崩潰可能只是延遲了這個問題。

想象一下,您可以防止崩潰,但結果是,用戶會將不正確的數據保存回數據庫,或損壞數據文件,那麼您只會使問題變得更糟。

相反,嘗試找出確切的問題是什麼:

  • 你傳遞不正確的參數給函數的第三方庫?
  • 還是第三方庫中的錯誤?面對錯誤的圖書館製造商。

或者:

  • 試圖找到一個解決辦法的問題
  • 找到

編輯庫替代: 說實話,我所遇到的去年與第三方組件相同的情況。我做的是以下幾點:

首先,使用一個_ try/_except構造來解決問題。這隻有在你知道哪個函數調用它完全崩潰時纔有效。它的工作原理是這樣的:

__try 
    { 
    Some3rdPartyLibraryFunction(); 
    } 
__except (EXCEPTION_EXECUTE_HANDLER) 
    { 
    } 

二,防止您的應用程序的進一步腐敗,確保第三方庫是不是你的應用程序中再調用。例如。假設庫是一個報告組件,那麼如果遇到崩潰,請不要讓用戶再次打開報告,如下所示:

bool MyClass::openReport (char *reportname) 
    { 
    if (!reportModuleEnabled) 
     return false; 

    __try 
     { 
     OpenTheReport(reportname); 
     } 
    __except (EXCEPTION_EXECUTE_HANDLER) 
     { 
     // Tell the user about the problem and prevent further access to the library 
     ShowMessage ("Sorry, no more reports"); 
     reportModuleEnabled = false; 
     return false; 
     } 
    return true; 
    } 
+0

如果有什麼,你應該嘗試和更快崩潰。 –

+0

_try沒有幫助。該庫執行文本解析,並用用戶輸入進行調用。它壓碎了一些文本,但我無能爲力。我想要的是向用戶顯示一些消息並關閉線程,而不是整個服務器進程崩潰 – mayap

+0

您在編譯器的命令行上指定了哪種異常處理機制?我使用/ EHsc,似乎在我的情況下正常工作。 – Patrick