[英]Catch error when QList index is out of bounds
我正在开发用于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来捕获此错误?
访问超出其范围的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();
我不是在Blackberry上编程,但是如果未捕获到异常,则最可能的原因是您引发的异常类型不是Exception。 作为最后的手段,您可以尝试全部解决。
try {
//a code that throws Null Pointer Exception
}
catch (...) {
}
并且您应该使用const reference以避免不必要的副作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.