使用尝试接球和投掷

using try catch and throw

本文关键字:      更新时间:2023-10-16

我对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()确实会引发异常。您应该改用它。

有不同类型的错误:

  1. 异常。这些是程序创建的错误,throw,您可以catch和处理这些错误。
  2. 访问冲突、系统异常等,也称为"崩溃"。这些是非常严重的,当它们发生时你不能做太多事情(至少不在标准C++的可能性之内),所以最好编写正确的程序,然后这些程序不会突然出现。
  3. 断言。这些用于在开发和测试期间检查程序逻辑和约束。它们通常只出现在调试代码中,即它们应该在发布版本中关闭。如果发生断言,则会在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块,所以如果没有创建窗口,你最终不会等待不存在的窗口的输入。

相关文章:
  • 没有找到相关文章