使用尝试接球和投掷
using try catch and throw
我对try函数的理解是阻止try和catch之间可能发生的错误。但是如果我做这样的事情:
std::vector<int> testvector;
testvector.push_back(1);
try{
cout << testvector[53485375345534] << endl;
}catch(...){
}
我的想法是它不会导致内存费用错误,但在这种情况下它什么也没做,仍然会弹出错误。
有人可以解释使用 try 的正确原因吗,到目前为止,根据我的经验,我可以事先使用 if 语句代替,有人可以举个例子来代替你需要一个 try 语句吗?
operator []
不检查 std::vector
中的边界。
但是,std::vector::at()
确实会引发异常。您应该改用它。
有不同类型的错误:
- 异常。这些是程序创建的错误,
throw
,您可以catch
和处理这些错误。 - 访问冲突、系统异常等,也称为"崩溃"。这些是非常严重的,当它们发生时你不能做太多事情(至少不在标准C++的可能性之内),所以最好编写正确的程序,然后这些程序不会突然出现。
- 断言。这些用于在开发和测试期间检查程序逻辑和约束。它们通常只出现在调试代码中,即它们应该在发布版本中关闭。如果发生断言,则会在Windows中弹出一个窗口,说明出了什么问题。
我只是在这里猜测 - 你使用的是MS Visual Studio吗?
MSVC 的向量实现在调试模式下检查operator[]
的参数,并断言该参数是否确实在向量的范围内。这个断言也不例外,所以你无法抓住它。
你的测试用例是无效的,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;
}
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概念。
当您使用某些不确定它们是否起作用的函数时,您将使用 throw 语句。例如,你想要制作一个GUI窗口,你将使用try块,所以如果没有创建窗口,你最终不会等待不存在的窗口的输入。
- 没有找到相关文章