为什么在C ++中使用try和catch()?

时间:2013-02-14 02:18:36

标签: c++ exception exception-handling try-catch

我理解trycatch()用于异常处理,以防在某些情况下程序中发生错误或崩溃。我也明白他们是如何工作的。但为什么要使用trycatch()?为什么不只使用查找某个案例的if()语句,如果这种情况属实,它会cout << //error code

5 个答案:

答案 0 :(得分:13)

异常处理:

  • 可以与没有机会返回单独的错误代码的构造函数和运算符一起使用(它们可以将对象设置为某种错误状态 - 这意味着进一步的内存使用 - 但客户端代码也必须记住检查该错误以后的状态)
    • 例如:用户定义的类型 - 类X - 支持符号x1 = x2 + x3 - 哪里可以返回错误代码?
  • 可以启动,因为特定的类/结构数据成员是在初始化列表中构建的 - 避免了进一步的数据成员构造,这可能注定要失败或浪费;相比之下,只有在构造函数体
  • 中才能实现显式错误处理
  • 更隐含 - 强调代码的正常成功流程,这可以使其更简洁,可读,可维护
  • 的用法不同 - 许多地方的例外可以在一个地方被捕获,这有时会使错误处理代码本身更简洁,可读,可维护
  • 简洁的好处实际上可以在错误处理可能重复的情况下导致更可靠的错误处理
  • 通常使用自己的内存区域,独立于用于局部变量的堆栈,函数参数,保存CPU寄存器和返回地址等;这意味着throw语句可能能够直接在该内存区域中可靠地构造异常对象,即使剩余的堆栈内存小于异常对象(虽然这是一个实现细节,并且不受标准保证)
  • 具有不同的性能配置文件,以便在某些情况下可以更快
  • 有助于从低级代码向中级代码传播更丰富的错误信息,这些代码可能不会“拥有”或希望/能够更改为传播错误代码C风格,直至处理

答案 1 :(得分:5)

try...catch做得更多。它解除了自从输入try以来为所有自动分配的对象调用析构函数的堆栈。如果按照建议的方式执行此操作,则必须手动跟踪这些对象,否则会出现内存问题(泄漏,覆盖,过时指针,双重删除)

答案 2 :(得分:1)

另一个原因是:您编写的代码也可能被其他人用作大型项目的一部分。并且由于使用内置的异常处理例程是一个标准,大型项目的维护者期望您同样处理异常,以便可以在较高级别正确地实现异常处理 - 更不用说使用标准的事实输出作为错误输出是一种可疑的做法(例如,可能会被抑制;或根本不被使用)。

UPD:我误解了你的问题。我描述的原因实际上证明了手动异常抛出的合理性,但没有使用try...catch块。

答案 3 :(得分:-2)

我将以我的一位英雄,ZeroMQ成名的MartinSústrik的引述回答,摘自http://www.250bpm.com/blog:4的博客文章

  

然而,当您的目标是保证不会发生未定义的行为时,避免直接故障的好处就变成了一场噩梦。提升异常和处理异常之间的脱钩,使得在C ++中避免失败如此简单,使得几乎不可能保证程序永远不会运行信息未定义的行为。

然后添加,我发现我使用try / catch来获得非常高的杠杆重启层,而不是其他任何东西。补充一点,我的意见真的没关系。我相信,使用异常处理的方式和原因背后的选择非常类似于喜欢绿色而不是蓝色的选择。个人,没有其他人的意见可能会改变它。

答案 4 :(得分:-2)

这个问题构成了一个错误的二分法。在Java和C#try - catch中与if竞争以便在失败时进行清理。在C ++中,主要是RAII技术(使用析构函数和单阶段构造)与if竞争以便在失败时进行清理。

如果问题是关于使用异常而不是使用if,那么它对于普通的C ++编程会更加明智和相关。