【发布时间】:2014-11-03 13:48:52
【问题描述】:
让我们考虑有一个 class 和一个 constructor 抛出一个异常 em> 如下:
class Class
{
public:
Class(type argument)
{
if (argument == NULL)
{
throw std::exception("Value cannot be null.\nParameter name: argument");
}
// Instructions
}
private:
// Properties
}
由于类 构造函数可能会抛出异常 我们不能直接声明一个对象。
Class obj(argument); // Harmful
这意味着必须调用 构造函数 必须使用 try/catch
try
{
Class obj(argument);
}
catch (std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
问题是我们只能在 try 块中使用 object。在 try 块之外使用它的唯一方法是声明一个 Class* pointer 然后使用 new 关键字构造一个新的 object 然后将其地址分配给前一个 指针。
Class* pObj;
try
{
pObj = new Class(argument);
}
catch (std::exception& ex)
{
std::cout << ex.what() << std::endl;
}
那么定义先前的类以便在不使用指针的情况下创建实例的标准方法是什么还是动态内存分配?
提前致谢
【问题讨论】:
-
如果您使用指针方法并且构造函数抛出,您可以捕获异常并仍然访问
try-catch块之外的指针。但是现在呢?你有一个指针但没有对象!异常的目的不是包装每个最终可能会在try-catch块中抛出的语句,从而再次线性化控制流。发明异常是为了允许相反的情况:在异常情况下(例如在错误地将 NULL 指针传递给不接受的构造函数之后)打破正常的控制流。 -
如果我没记错的话,我在某个地方看到这不是一个真正好的设计。因此,您应该怎么做才能毫无例外地创建它,并检查它是否已正确创建。
-
如果您不喜欢异常但更喜欢传统的错误处理,那么就这样做吧。但是,如果您将函数设计为抛出异常(我更喜欢这样做),那么之后不要与该机器作斗争。传递了无效参数的构造函数引发的异常应该 (§ 22)“破坏”程序。 (如果您希望程序继续运行,请不要传递无效参数。)
-
如果我没记错的话,标准
std::exception没有将const char*作为参数的构造函数。 -
可能想要
std::runtime_error
标签: c++ class exception constructor