我想知道以下哪种方法在发生out_of_range()错误时抛出用户定义的异常是更好的方法。对我来说,作为一个没有经验的人,他们是一样的。但我好奇地想知道这两者之间是否会有什么不同,如果是的话,是什么。
std::vector<int> container {1, 2, 3, 4, 5};
int function1(int x, int y) {
if(x < 0 || y < 0)
throw USER_DEFINED_OUT_OF_RANGE();
if(x >= container.size() || y >= container.size())
throw USER_DEFINED_OUT_OF_RANGE();
return container[x] + container[y];
}
int function2(int x, int y) {
try {
return container[x] + container[y];
}
catch(const std::out_of_range& e) {
throw USER_DEFINED_OUT_OF_RANGE();
}
}发布于 2017-02-25 04:17:50
第一个可以工作,第二个不行,所以第一个更好。
(container[x]是未定义的行为如果x超出范围,它不会抛出。你可以通过使用at()来解决这个问题,就像@NeilButterworth建议的那样。)
但是你忽略了一个更重要的问题--你根本不应该这样做。对于这个上下文,有一个非常好的标准例外,将它转换为其他东西对任何人都没有帮助。
发布于 2017-02-25 01:32:50
如果索引超出范围,向量就会抛出异常。使用:
container.at(x) + container.at(y)或者在您的文档中说明使用无效索引的结果是未定义的,并且根本不做任何检查。
https://stackoverflow.com/questions/42444768
复制相似问题