这是我的采访问题。
令人惊讶的是,我从来没有想过这个问题。
我们可以在构造函数c ++中进行异常处理吗?
在时态中并没有多想我说“是的我们可以在构造函数中执行它。我们说我们使用new运算符为指针成员分配一些内存并且它抛出一个错误的alloc异常,这样就有一个提出例外的可能性“
后来我认为构造函数永远不能返回一个值。那么构造函数中的异常如何被捕获。现在我问这个问题!
任何人都可以帮助我摆脱这种混乱吗?
答案 0 :(得分:12)
请参阅此GOTW Constructor Failures问题,该问题会在一定程度上解决您的查询,并继续说这是浪费时间。
答案 1 :(得分:2)
构造函数没有返回类型, 所以不可能使用退货 码。信号的最佳方式 因此构造函数失败 抛出一个例外。如果你没有 使用例外的选项, “最不好”的解决办法就是放弃 对象变成了“僵尸”状态 设置内部状态位,以便 对象行为有点像死了 即使它在技术上仍然是 活着。
您将在调用代码中捕获异常,而不是在构造函数中。
有关详细信息,请参阅How can I handle a constructor that fails?(实际上,我建议您阅读有关异常处理,真正具有启发性的整个页面。)
答案 2 :(得分:0)
异常处理和返回类型完全不同。当程序在构造函数中找到异常时,它几乎通过catch块[if used]或抛出到调用者(main())抛出异常。在这种情况下,我们在构造函数中捕获块并由它处理异常。处理完异常后,构造函数/函数中的剩余语句将开始执行。见下面的例子,
class A
{
public:
A(){
printf("Hi Constructor of A\n");
try
{
throw 10;
}
catch(...)
{
printf("the String is unexpected one in constructor\n");
}
printf("Hi Constructor of A\n");
}
~A(){
printf("Hi destructor of A\n");
}
};
int main()
{
try{
A obj ;
throw "Bad allocation";
}
catch(int i)
{
printf("the Exception if Integer is = %d\n", i);
}
catch(double i)
{
printf("the Exception if double is = %f\n", i);
}
catch(A *objE)
{
printf("the Exception if Object \n");
}
catch(...)
{
printf("the Exception if character/string \n");
}
printf("Code ends\n");
return 0;
}
这产生输出:
Start: Constructor of A
the String is unexpected one in constructor
End: Constructor of A
Hi destructor of A
the Exception if character/string
Code ends
答案 3 :(得分:-2)
C ++有类似于其他语言的try-catch子句。可以在线找到教程:http://www.cplusplus.com/doc/tutorial/exceptions/
编辑:示例变成了完全正常工作的代码
#include <iostream>
using namespace std;
class A
{
public:
void f(){
throw 10;
}
A(){
try{
f();
}
catch(int e){
cout << "Exception caught\n";
}
}
};
int main (int argc, const char * argv[])
{
A a;
return 0;
}
这会产生输出:
Exception caught