![]() |
1
4
乔纳森的回答是正确的。此外,虽然分数可能处于有效状态,但我不建议对流控制使用异常,以及
尤其地
用于对象状态的通信。相反,考虑添加一些
|
![]() |
2
5
捕获异常后,F1超出范围。它已经不存在了,所以你不能使用它。 |
![]() |
3
2
不,一旦在出口中定义了f1的作用域,就不能再使用该对象。因此,在您的代码中:
也就是说,当你不能代表 实际值。因为这可能只适用于某些用途,您可以要求呼叫者请求它:
|
![]() |
4
2
如前所述,如果抛出异常,则对象将超出范围。但是,当您分配对象时,您可能会感兴趣:
在这种情况下,F也是不可用的,因为构造函数没有完成工作,指针也没有被分配。无法调用析构函数,内存为 解除分配的 因此无法使用该对象。 因此,通常构造对象,如果您打算使用类,则不要使用异常。使用is-exact()成员函数来决定构造后是否精确。 |
![]() |
5
1
我同意费布雷托的观点。 如果您在构造函数中抛出一个错误,相当于说“构造此对象不起作用”或“无法创建对象”,因此您需要处理这个事实-我只会针对无法使用该对象的致命错误执行此操作,否则,例如无法在mysettingsreader cl中打开我们希望能够打开的文件。屁股。 |
![]() |
6
1
遵循JMD 那么在catch子句中f1是可用的。答案也是否定的,所以您会看到范围规则甚至阻止您在代码中问这个问题。 唯一会泄露这个物体存在的东西是如果它的析构函数运行的话——但是如果这个构造函数没有完成,它就不会运行。 |
![]() |
7
1
是的,它 取决于 的确。我是说,这取决于你的意思 对象有效 . 有效可以有多个含义。 众所周知,被构造中断的对象是部分构造的对象。现在,如果您将部分构造视为无效状态,那么是的,这样的对象将是无效的。 然而,根据C++/15.2中指定的方案,这种破坏是有保证的:
这意味着,只有部分构造对象的子对象才能被正确地销毁,但部分构造对象本身的析构函数将 不 被召唤。
|
![]() |
8
0
如果一个对象在构造过程中抛出一个异常,它不会在技术上使该对象失效。在您的示例中,f1超出了作用域,因此在引发异常时被释放。 如果f1是在try块内分配和构造的指针,并且构造函数(而不是分配器)引发异常,则指针将指向有效的已分配内存。内存中的对象是否包含有效数据将取决于您的构造函数;基本上,如果数据在引发之前是有效的,那么在引发之后是有效的。 而且,听起来您试图做的事情不适合用于例外情况,我会在这里质疑您的设计。在构造函数调用中引发异常通常表示对象没有正确构造,不应使用。 |
![]() |
9
0
如果在构造函数的任何阶段引发异常(并且未在构造函数中捕获),则对象将不存在。所有已成功构造的成员变量都将按与构造完全相反的顺序进行解构。如果异常是从成员变量构造函数或初始化列表中引发的,则未能构造的成员变量没有调用其析构函数,也没有任何析构函数出现在该变量之后。
在任何情况下,假设您在任何地方都使用RAII,那么所有资源都将被正确释放,并且不会有任何对象访问。如果是
请注意,在构造其他对象的表达式中使用new运算符是错误的:
|
|
M.Jane · 组织和编写异常类的正确方法 6 年前 |
![]() |
shubham daharwal · java中的内部捕获异常 6 年前 |
![]() |
Jon · 如何在不需要任何操作的情况下处理Python异常 6 年前 |
![]() |
felix1415 · C++捕获(标准::异常和e)与捕获(…) 6 年前 |
![]() |
k0pernikus · 如何在scala中键入可能引发异常的函数? 6 年前 |