訪問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();
我想你想趕上'const std :: exception&e'。 – BoBTFish 2013-05-10 09:10:15
@BoBTFish這不是錯誤。我在發佈問題之前先試過 – 2013-05-10 09:11:46
那麼拋出異常的實際類型是什麼?第二個想法可能不是'std :: exception'。所以它最有可能繼承自其他一些異常基類。 – BoBTFish 2013-05-10 09:13:17