0

我对 try 函数的理解是停止在 try 和 catch 之间可能发生的错误。但如果我做这样的事情:

std::vector<int> testvector;
testvector.push_back(1);

try{
cout << testvector[53485375345534] << endl;
}catch(...){

}

我的想法是它不会导致内存费用出现错误,但在这种情况下它什么也不做,仍然会弹出错误。

有人可以解释使用 try 的正确原因吗,到目前为止,根据我的经验,我可以事先使用 if 语句,当你需要 try 语句时,有人可以给我一个例子吗?

4

5 回答 5

3

operator []不检查std::vector.

但是,std::vector::at()确实会引发异常。您应该改用它。

于 2013-01-24T07:13:45.133 回答
2

有不同类型的错误:

  1. 例外。这些是您的程序创建的错误throw,您可以catch处理这些错误。
  2. 访问冲突、系统异常等等,也就是“崩溃”。这些是非常严重的,当它们发生时你不能做太多(至少不是在标准 C++ 的可能性范围内),所以最好编写正确的程序然后这些不会出现。
  3. 断言。这些旨在在开发和测试期间检查您的程序逻辑和约束。它们通常只出现在调试代码中,即它们应该在发布版本中关闭。如果发生断言,在 Windows 中会弹出一个窗口,说明出了什么问题。

我只是在这里猜测-您使用的是 MS Visual Studio 吗?

MSVC 的向量实现operator[]在调试模式下检查 ' 参数并断言该参数是否确实在向量的范围内。该断言也不例外,因此您无法捕捉到它。

于 2013-01-24T08:24:44.810 回答
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;
}
于 2013-01-24T07:16:43.393 回答
1

Try-Catch 的概念是关于处理可能会破坏您的程序的错误,但大多数情况下可以在不这样做的情况下进行处理。您的示例对于完全正确的操作来说是一个很好的示例,但前提是您请求的数据存在。“仅当”可以由函数本身处理,但是您永远无法对错误的输入做出反应。相反,在这种情况下,如果您使用 Try-Catch 包围调用,则该函数会引发可由您的代码处理的异常。在 Catch 块中,通常会意识到您通知用户或至少将错误行为写入日志文件,您还可以加载默认值甚至更改变量并重复函数调用。有时 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 概念。

于 2013-01-24T07:40:13.373 回答
0

当您使用一些您不确定它们是否会工作的函数时,您将使用 throw 语句。例如,您想创建一个 GUI 窗口,您将使用 try 块,因此如果没有创建窗口,您将不会最终等待不存在的窗口上的输入。

于 2013-01-24T07:30:27.010 回答