我对try函数的理解是阻止try和catch之间可能发生的错误。 但如果我做这样的事情:
std::vector<int> testvector;
testvector.push_back(1);
try{
cout << testvector[53485375345534] << endl;
}catch(...){
}
我的想法是它不会导致内存费用出错,但在这种情况下它什么都不做,错误仍然会弹出。
有人可以解释使用try的正当理由,到目前为止,根据我的经验,我本可以预先使用if语句,有人可以在需要try语句时给我一个例子吗?
答案 0 :(得分:3)
operator []
不会检查std::vector
中的边界。
但是,std::vector::at()
确实会抛出异常。你应该改用它。
答案 1 :(得分:2)
有不同类型的错误:
throw
以及您可以catch
处理的错误。 我只是猜测 - 您使用的是MS Visual Studio吗?
MSVC的向量实现在调试模式下检查operator[]
的参数,如果参数确实在向量的范围内,则断言。该断言不是一个例外,所以你无法抓住它。
答案 2 :(得分:1)
您的测试用例无效,std::vector::operator[]
没有进行边界检查,也没有抛出异常,您期望未定义的行为而不是异常。您可以尝试std::vector::at功能
std::vector<int> testvector;
testvector.push_back(1);
try{
std::cout << testvector.at(53485375345534) << endl;
}catch(std::exception& e){
std::cout << e.what() << std::endl;
}
答案 3 :(得分:1)
Try-Catch的概念是关于处理错误,它可能会破坏你的程序,但大多数情况下都可以在不这样做的情况下处理。 您的示例对于完全正确的操作来说是一个很好的例子,但仅当您请求的数据存在时。 “只有当”可以由函数本身处理,但是你永远不会对错误的输入做出反应。相反,在这种情况下,函数会抛出一个异常,如果用Try-Catch包围调用,则代码可以处理该异常。 在Catch块中,通常会感谢您通知用户或至少将missbehavior写入日志文件,您还可以加载默认值,甚至更改变量并重复函数调用。 有时,Try-Catch被描述为“请求宽恕而非许可”(后者将是先前的If)。
通常,Try-Catch可以伪代码形式读取:
Try:
Do what you think is right to do but be aware it could be wrong...
Catch:
You were too optimistic and should react in a proper way...
我希望这有助于更好地理解Try-Catch概念。
答案 4 :(得分:0)
当您使用某些您不确定它们将起作用的函数时,您将使用throw语句。例如,你想制作一个GUI窗口,你将使用一个try块,所以如果没有创建窗口,你就不会在不存在的窗口上等待输入。