1

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

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

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

}

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

我尝试了 catch (std:exception& e) 和 catch(...) ,但也没有用。

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

4

2 回答 2

8

访问QList超出其范围的 a不会引发异常。相反,它假定您已经检查过索引是否在范围内(如果这不是真的会发生什么,下面会解释)。

实际上,这不是一个糟糕的设计,而是容器类的一个好的设计:有时(在大多数情况下)您已经知道索引在范围内。如果 Qt 应该通过抛出异常对越界访问做出反应,这意味着您要依赖此检查,这意味着必须完成此检查即使您不需要 Qt 来检查它)。Qt 所做的是假设您提供了一个有效的索引。在调试版本中,这会通过断言进行检查,如果不满足断言,您的程序会以某种原因终止(您可以很好地跟踪它以进行调试),但在发布模式下,根本不会进行此检查,因此它会静默如果索引仍然超出范围,则会产生未定义的行为访问数据结构中的原始内存。这是尽可能快的,但要求索引有效。

如果不满足断言将终止您的进程,这意味着您无法“捕获”此类错误。首先避免它,即在访问列表之前测试您的索引是否在范围内。

请注意,某些(可能是全部?)容器类还提供具有“真实”索引检查的访问(没有崩溃,也在发布版本中),即在超出范围时具有定义和预期的行为。对于QList,这个函数是:

T value(int index, T fallbackValue)

它尝试通过index边界检查访问元素。如果您的索引不在范围内(或在关联容器中:未找到),fallbackValue则将返回您提供的索引。第二个参数默认为 default-constructed T。请注意,即使您的索引正确,也必须构造此值。这就是为什么即使在您想要检查的情况下,最好使用分支手动进行检查,并且仅在需要时构造默认值(特别是如果您需要评估昂贵的表达式来构造回退值):

if (index < myList.count())   // We only check upper bound in this scenario
    foo = myList[index];
else
    foo = expensiveFunctionReturningMyFallbackValue();
于 2013-05-10T09:26:53.940 回答
-1

我不是在黑莓上编程,但是如果没有捕获到异常,最可能的原因是你抛出的异常类型不是Exception。作为最后的手段,你可能会尝试抓住所有的人。

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

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

于 2013-05-10T09:16:19.543 回答