使用try catch和throw

时间:2013-01-24 07:11:33

标签: c++ try-catch

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

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

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

}

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

有人可以解释使用try的正当理由,到目前为止,根据我的经验,我本可以预先使用if语句,有人可以在需要try语句时给我一个例子吗?

5 个答案:

答案 0 :(得分:3)

operator []不会检查std::vector中的边界。

但是,std::vector::at()确实会抛出异常。你应该改用它。

答案 1 :(得分:2)

有不同类型的错误:

  1. 异常。这些是您的程序创建的错误,throw以及您可以catch处理的错误。
  2. 访问冲突,系统异常等,又名“崩溃”。这些非常严重,当它们发生时你不能做太多(至少不在标准C ++的可能性范围内),所以最好编写正确的程序然后这些不会出现。
  3. 断言。这些用于在开发和测试期间检查程序逻辑和约束。它们通常只出现在调试代码中,即它们应该在发布版本中关闭。如果发生断言,在Windows中弹出一个窗口,说明出了什么问题。
  4. 我只是猜测 - 您使用的是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块,所以如果没有创建窗口,你就不会在不存在的窗口上等待输入。