【问题标题】:Try Catch Block Creating an Object尝试 Catch 块创建对象
【发布时间】:2014-02-22 02:33:06
【问题描述】:

所以对于我正在学习的课程,我们正在练习重载运算符,但更具体地说,我们正在为分数(有理数)设计一个课程。我正在玩 try-catch 块,似乎无法让它像我想要的那样工作,也找不到任何关于我无法弄清楚的论坛或文章。我试图在 try-catch 块中创建有理数对象,以确保放入分母的值不是“0”,如果是,我让 catch 块调用对象的解构函数。我得到这个位工作得很好,但似乎没有办法让我稍后在代码中使用在 try-catch 块中创建的对象,即使构造函数成功地为分母分配了一个非零值.有没有办法在 try-catch 块中声明一个对象,以验证它在创建时不会引发异常,但仍然在 try-catch 块之外但仍在的其余代码范围内相同的功能还是没有办法关闭它?

【问题讨论】:

  • 一般来说,最好贴出你已经尝试过但遇到困难的代码。
  • 您不需要在 catch 子句中为任何本地对象显式调用析构函数。当对象出于任何原因(包括抛出异常)超出范围时会自动调用它们。这就是RAII 起作用的原因。

标签: c++


【解决方案1】:

try 引入了一个新范围。您不能在try 之外使用成功构造的对象,因为它们已超出范围并已被破坏。这适用于在任何块中创建的对象,例如 forif,或任何一组 { } 大括号。您要做的是将依赖于对象的代码移动到try

例如:

try {
  Rat rat1(3, 1);
  Rat rat2(2, 4);
  Rat rat3 = rat1 + rat2;
  std::cout << rat3 << std::endl;
}
catch (std::exception& e) {
  // above should not throw
}

try {
  Rat rat1(3, 1);
  Rat rat2(2, 0);  // throws
  Rat rat3 = rat1 + rat2;
  std::cout << rat3 << std::endl;
}
catch (std::exception& e) {
  // code here will execute
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2013-01-01
    • 2010-12-25
    • 1970-01-01
    • 2023-03-18
    • 2022-06-10
    • 2011-09-23
    相关资源
    最近更新 更多