2013-05-10 134 views
-1

我正在爲Blackberry 10開發應用程序,當我嘗試從QStringList中獲取元素2,而此列表僅包含1個元素時,我的應用程序崩潰。當QList索引超出範圍時發生捕獲錯誤

我使用下面的代碼來捕獲這種類型的錯誤:

try { 
    //a code that accesses QStringList with an index out of bounds 
} 
catch (Exception e) { 

} 

但例外沒有被捕獲和應用老是死機。

我試過catch(std:exception & e)和catch(...)並沒有工作。

如何使用try catch捕獲此錯誤?

+2

我想你想趕上'const std :: exception&e'。 – BoBTFish 2013-05-10 09:10:15

+0

@BoBTFish這不是錯誤。我在發佈問題之前先試過 – 2013-05-10 09:11:46

+0

那麼拋出異常的實際類型是什麼?第二個想法可能不是'std :: exception'。所以它最有可能繼承自其他一些異常基類。 – BoBTFish 2013-05-10 09:13:17

回答

4

訪問QList超出其範圍不會引發異常。相反,它假定,您已經檢查過該索引是否在該範圍內(如果不是這樣,會發生什麼情況將在下面解釋)。

實際上,這不是一個糟糕的設計,而是一個很好的容器類設計:有時(在大多數情況下)你已經知道索引在範圍內。如果Qt應該通過拋出異常來對出界訪問作出反應,這意味着您要依靠此檢查,這意味着此檢查已完成(即使您不需要Qt來檢查它)。 Qt所做的是假設你提供了一個有效的索引。在調試版本中,這將得到檢查斷言,如果斷言不符合您的程序終止有一個原因(你可以很好地跟蹤調試),但在發佈模式下,這個檢查不是在全部爲,所以如果索引超出仍然訪問數據結構中的原始內存,它會默默地產生未定義的行爲。這儘可能快,但要求索引有效。

如果不符合,斷言會終止您的過程,這意味着您無法「捕捉」這種錯誤。 避免它在第一個地方,即測試您的索引在範圍之前訪問列表。請注意,一些(也許是所有?)容器類還提供了一個具有「真實」索引檢查的訪問(在發佈版本中也沒有崩潰),即在超出邊界時具有已定義和預期的行爲。對於QList,這個功能是:

T value(int index, T fallbackValue) 

它試圖在index與範圍檢查訪問的元素。如果您的索引不在範圍內(或在關聯容器中:未找到),則您返回的fallbackValue將返回。第二個參數默認爲默認構建的T。請注意,即使您的索引正確,也必須構建此值。這就是爲什麼即使在需要檢查的情況下,使用分支手動檢查可能也會更好,並且如果需要,只需構建默認值(特別是如果您需要評估昂貴的表達式來構造回退值):

if (index < myList.count()) // We only check upper bound in this scenario 
    foo = myList[index]; 
else 
    foo = expensiveFunctionReturningMyFallbackValue(); 
+0

你確定它斷言?查看['QList :: at'](http://qt-project.org/doc/qt-4.8/qlist.html#at)和['QList :: operator []']的文檔(http: //qt-project.org/doc/qt-4.8/qlist.html#operator-5b-5d),他們都說'我必須是列表中有效的索引位置(即0 <= i BoBTFish 2013-05-10 09:33:01

+2

@BoBTFish調試構建:'assert',發佈構建:「承擔」 – leemes 2013-05-10 09:35:18

+0

@眼鏡這麼有用謝謝 – 2013-05-10 12:25:29

-1

我不是在Blackberry上編程,但如果沒有捕獲異常,最可能的原因是您拋出的異常類型不是異常。作爲最後的手段,你可以嘗試捕捉所有。

try { 
    //a code that throws Null Pointer Exception 
} 
catch (...) { 
} 

而且您應該使用const引用來避免不必要的副作用。

+0

如何捕捉所有?你的意思是趕上(...)?因爲它沒有工作 – 2013-05-10 09:17:47

+0

你剛剛發佈了他的代碼片段?你是否想把它變成「catch(...)」?哪個應該起作用,但通常是一個壞主意。 – BoBTFish 2013-05-10 09:17:53

+0

對不起,我的意思是趕上(...)。 – Bingfeng 2013-05-10 09:42:22