访问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