2011-12-30 65 views
0

是否有可能从C++中的向量“超出范围”错误中恢复?从向量中恢复无法到达的错误

像这样的功能:

vector<int> numbers; 

bool isAccessable(int i) 
{ 
    try 
    { 
    numbers[i]; 
    catch (...) 
    { 
    return false; 
    } 

return true; 
} 

有可能在C#中,但C++?

+0

用于流量控制的例外情况是一个坏主意。为什么不在访问元素之前检查范围:'if(i> = 0 && i 2011-12-30 12:39:49

回答

3

如果你只是要检查索引是否在范围内,后来干脆:

return i < numbers.size(); 

(你也应接受零比较或索引更改为无符号类型; size_t通常类型用于数组索引)

如果你想尝试访问的价值,并抛出一个异常,如果该指数超出范围,则使用at而非[]

try { 
    do_something_with(numbers.at(i)); 
    return true; 
} catch (std::out_of_range const &) { 
    return false; 
} 
+0

如果函数已经使用了[]。它有一个静态库,我没有访问源代码:(。vector是一个受保护的成员,它仍然有可能吗? – mikbal 2011-12-30 12:47:19

+0

@mikbak:不幸的是,如果索引超出范围,'[]'除非你使用'vector'的实现来增加额外的错误检查。 – 2011-12-30 12:55:52

+0

谢谢你,我会请求源代码并修改它。 – mikbal 2011-12-30 13:07:44

3

在C++中没有运算符[]的范围检查,但存在vector :: at()。

尝试

numbers.at(i); 

代替。

+0

运算符[]可以执行范围检查,但不是必需的。 at()需要范围检查。 – Sjoerd 2011-12-30 12:38:16

+0

好的,在C++中最常见的是*没有范围检查'operator []'。 :-) – 2011-12-30 12:47:21

1

使用std::vector::at()成员函数。它抛出了一个out_of_range异常。