2013-05-10 99 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