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

aan*_*nrv 10 c++ exception-handling exception try-catch

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

Ton*_*roy 13

异常处理:

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

  • @ Cheersandhth.-Alf:标准15.1.4"异常对象的内存以未指定的方式分配,除非在3.7.4.1中说明." - 这不需要单独的堆栈,但正是因为典型的实现提供了单独的堆栈.*异常对象的生命周期与主堆栈无关 - 那么您认为分配是如何完成的?*.用你的大脑在线条之间阅读一下! (4认同)
  • @ Cheersandhth.-Alf:与您反对的技术主张相关的链接比您试图给我们留下深刻印象的一些自命不凡的细微差别更为有用,你想归咎于"废话" (3认同)
  • @ Cheersandhth.-Alf:"没有在堆栈上分配" - 我说一个单独的堆栈不是"堆栈",其中"the"意味着与局部变量等等.如果你不仔细阅读,你最终会得到废话.我已经详细说明了异常与返回错误值不同的特定场景 - 您可以返回一个更适合"堆栈"的更大对象,因为异常对象可能在其他地方.这些都不是胡说八道.请注意,所描述的行为是关于避免堆栈溢出,而不是一个之后的行为.而且,你是一个粗鲁的混蛋. (3认同)

Jam*_*mes 5

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

  • 这根本不是真的......如果函数返回错误代码而不是异常,调用者中的`if(错误)返回`逻辑也会冒错误调用同样的析构函数.如果存在需要重新分配的原始指针,异常将不会神奇地安排释放. (2认同)