2012-04-10 72 views
0

可能有人給我解釋一下什麼是以下「調試器故障通知」意味着C++ Builder的XE:應用程序定義的異常

"Project ... faulted with message: 'application-defined exception (code 0x0eefface) at 0x755ad36f. Process Stopped. Use Step or Run to continue." 

,當我需要拋出一個異常,只發生 - 拋調用引發這個錯誤。 我找不到有關此問題的任何信息。

拋出異常的:

#define MY_ERROR_CODE 0xE0000046 

throw TMyTrouble(MY_ERROR_CODE, "My error message"); // calling of this raises the application-defined exception... 

醒目:異常

try{ 
Function(); // function that raises the exception TMyTrouble 
} 
catch(...){ // this catch should catch the exception but it doesn't 
// do something 
throw; // throw to upper layer 
} 

定義:

class TMyTrouble{ 
     public: 
     TMyTrouble(int errorCode = 0xFFFFFFFF, AnsiString errorMessage = "Unknown error") { FMessage = errorMessage; FCode = errorCode;} 
     __property AnsiString Message = {read = FMessage}; 
     __property unsigned long Code = {read = FCode}; 

     private: 
     unsigned long FCode; 
     AnsiString FMessage; 
    }; 
+0

是否有一個'catch'處理引發的異常? – hmjd 2012-04-10 11:12:59

+0

是的,但它沒有捕獲任何東西 - 那是什麼奇怪 – Martinique 2012-04-10 11:27:14

+1

你可以發佈'throw'和'catch'代碼加異常定義嗎? – hmjd 2012-04-10 11:31:53

回答

0

是不是隻是調試器的方式說,「我只是注意到拋出了一個異常,你想要做什麼?「

如果您不希望調試程序在拋出異常時停止,則會有設置。

如果你選擇contine,那麼你的代碼就應該抓住它。

+0

我不這麼認爲......調試器會根據您的說法提示您拋出異常,但這看起來像拋出過程的一些內部錯誤,因爲拋出不會被執行 - 它不會被捕獲!它看起來像拋出過程拋出一些內部異常 - 但它是奇怪的,因爲它應該趕上catch語句,但它不是... :( – Martinique 2012-04-10 15:30:48

+0

不,這是肯定的調試器報告第一次機會例如在應用程序看到它之前,這一點在文本中顯示爲「Process Stopped。Use Step or Run to continue」,這是非常正常的行爲,執行消息所說的話按F9繼續執行,異常將被傳遞到應用程序進行處理 – 2012-04-10 22:54:38

1

你所看到的是完全正常的行爲。你所看到的被稱爲「第一次機會例外」消息。調試器會在應用程序看到異常之前報告消息。消息中的文字顯示了這一點:「進程已停止,使用步驟或運行以繼續」。只需按照消息所述 - 只需按F9或按工具欄上的運行按鈕即可繼續執行,異常將傳回應用程序以便在其try/catch塊中進行正常處理。

+0

那麼,爲什麼通常不會被catch語句捕獲?在釋放模式下,拋出異常會導致應用程序崩潰,這是不正常的,因爲拋出異常時沒有catch語句原因一個錯誤對話框,但不會掉落應用程序... – Martinique 2012-04-11 04:57:48

+0

如果我在按照您所說的方式顯示「第一次機會異常」消息之後按F8(前進),比我的異常未執行,並且p rogram繼續,那是什麼在拋出語句後 – Martinique 2012-04-11 05:30:44

+0

'catch(...)'並不總是抓住所有東西。例如,自BCB6以來,它不能正確捕獲VCL的'Exception'對象。嘗試明確地捕捉'TMyTrouble':catch(const TMyTrouble&e)' – 2012-04-11 18:58:01

0

我道歉,向所有的你,問題是在throw語句施工前:

byte value; 
sscanf(buffer, "%02x", &value); 

你能看到這個問題? sscanf函數返回該格式字符串"%02x"長值(4字節),但我有一個字節變量value(1字節) - 所以3個字節被寫入某處,堆棧被損壞(或某事),是什麼原因導致我的問題...

謝謝你的幫助