2012-08-14 76 views
2

我得到了下面的代碼:例外。嘗試 - catch塊

set<Object*>::iterator it; 
try 
    { 
     for (it = SetOfObjects->begin(); it != SetOfObjects->end(); ++it) 
     { 
      //some actions, not applicable to the question 
     } 
    } 
    catch(...) 
    { 
     this->m_error_raiser->error_Name = "Station isn`t connected to Object! Use connectToObject method or list of forecast objects is empty"; 
     this->m_error_raiser->error_Number = 101; 
     //throw (this->m_error_raiser); 
    } 

如果不創建SetOfObjects的情況下,我試圖通過這組我得到了預期的運行時錯誤進行迭代。

因此,我決定處理該錯誤,並通過try catch的方式向用戶提供相關信息。我的程序仍然在運行期間終止,這與我期望的行爲相矛盾:它應該繼續工作,因爲所有生成的異常被處理。這裏有什麼問題?

+0

你得到了什麼錯誤?如果它只是終止,它可能與異常無關。您標記爲「不適用」的代碼似乎是真正問題的原因。 – SingerOfTheFall 2012-08-14 10:25:15

+4

如果'SetOfObjects'爲null或未初始化的指針,則行爲是未定義的。 – hmjd 2012-08-14 10:27:36

+0

我得到未處理的異常。不適用的代碼真的不適用(我已經評論過,沒有任何改變) – 2012-08-14 10:27:41

回答

3

如果對象是指針並且未初始化,則此對象的用法爲undefined behaviour。您不能通過exception handling(按標準)處理此類指針的使用。默認情況下初始化爲0,並在使用前驗證指針不是null

+0

對此的警告 - 這會給只使用Windows的開發人員造成很大困惑 - 是Windows *中的一些(所有)版本的C++運行庫*實際上捕獲低級異常並從它們生成C++異常。你當然不應該期望這個功能可移植! – marko 2012-08-14 10:34:46

+1

http://stackoverflow.com/questions/1823721/how-to-catch-the-null-pointer-exception – Gir 2012-08-14 10:37:31

+0

謝謝你,我最近閱讀了B.Straustroup的C++,專門討論異常,但我沒有'在任何關於未定義行爲的地方,我可能已經無意識地閱讀它,需要閱讀。以前我認爲當seg故障出現時,它也會通過例外來實現。 – 2012-08-14 10:47:40

2

在Windows環境中,您在技術上可以捕獲像這樣的低級異常(解除引用空/未初始化的指針) - SEH異常。這是通過使用特定於Microsoft的__try()和__except()語句完成的。

如果你有一個外部不是很好編寫的庫,它會崩潰(遵循空指針等),而不是報告錯誤,即找不到文件時,這可能很有用。

但是,正如已經在評論中提到的那樣,在你的代碼中使用它是不可移植的。它們不能與C++異常互操作。所以,即使你決定使用它們,你最終會得到2個異常處理機制的分歧......很可能是一個糟糕的設計)

但是,如果你的代碼依賴於異常處理的錯誤報告,你總是可以進行空檢查並在失敗時拋出自定義異常:if(pointer==NULL) throw something;

+0

謝謝。我已經通過默認初始化具有零值的指針來解決我的情況,檢查值是否已更改並拋出異常,實際上我是按照您的建議做的。我會閱讀__try,雖然它們可以影響程序的可移植性,但感謝您的信息 – 2012-08-14 12:00:47