当QList索引超出范围时捕获错误

时间:2013-05-10 09:07:16

标签: c++ cascade blackberry-10

我正在为Blackberry 10开发一个应用程序,当我尝试从QStringList获取元素2时,此列表只包含1个元素,我的应用程序崩溃。

我使用以下代码来捕获此类错误:

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

}

但是没有捕获异常,应用程序总是崩溃。

我尝试了catch(std:exception& e)并捕获(...)并且也没有用。

如何使用try catch来捕获此错误?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:-1)

我不是在Blackberry上编程,但如果未捕获异常,最可能的原因是您抛出的异常类型不是Exception。作为最后的手段,你可能会试图抓住所有。

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

你应该使用const引用来避免不必要的副作用。