我有一个类foo
(我不能修改),它只有一个构造函数,它接受一个参数,如下所示:
foo bar("Hello!");
由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是:
try {
foo bar("Hello!");
}
catch {
cerr << "Something went horribly wrong...";
return -1;
}
但是,现在foo
在try
块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在try
块之外声明bar
。那么,我该如何捕捉构造函数抛出的错误呢?
编辑:为了澄清,这是在我的main
中,在catch
中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输入永远不会引发异常。
您可以使用堆分配:
foo *p = 0;
try {
p = new foo("parm");
} catch(const Error& err) {
...
}
foo& instance = *p;
// Here you can use instance normally...
delete p; // destroy before leaving scope (or use a smart pointer)
问题相当简单:构造函数失败了,因此从未创建bar
对象。C强制执行此操作,并防止您在这种情况下使用bar
。
您可以通过另一种方式解决此问题:
foo makeFoo()
{
try {
return foo("Hello!"); // May throw
}
catch(...) {
return foo("Safe"); // We know that "Safe" will not throw.
}
}
bar foo{makeFoo()};
如果您想在抛出异常时退出程序,您可以打印一条错误消息并在catch中调用export(EXIT_FAILURE)
。
当异常在构造函数中被抛出时,其中创建了多个对象,必须做些什么来清理内存。例如。 我的直觉是,将每个对new的调用放在一个单独的try-catch组中,并删除之前为其调用了,但这太冗长的所有对象(第一个try组不调用析构函数,第二个类调用第一个类的析构函数,第三个类调用前两个类的析构函数,以此类推)。我的问题是:最常见的处理方法是什么? 另外,假设类对象包含一个不是用new创建的对象(因为它在堆栈上
这是我的代码: 以下是我的任务要求: 一个参数化构造函数,将接收endpoint(作为点)、方向(作为int)和样式(作为字符串)。如果接收到的点或字符串为空,则抛出新的IllegalArgumentException( 我知道我检查样式是虚线、虚线还是双精度的部分出了问题,因为当我把它注释出来时,除了那个部分,所有的东西都工作了。就现在的情况而言,它只是在所有事情上抛出了非法的辩论例外。 我有一
问题内容: 在下面的代码中: 从api 使用(in )和使用抛出错误(in )有什么区别? 完全一样吗? 如果相同,为什么我们需要回调呢? 问题答案: 从api 使用(in )和使用抛出错误(in )有什么区别? 是的,当是回调时,您不能异步使用。例如,一些超时: 完全一样吗? 不,至少在您的语句后面跟随其他代码时才不会。立即完成解析程序功能,同时调用继续正常执行-在“标记”了承诺被拒绝之后。 此
在以下代码中: 在Promise api中使用(在中)和使用
主要内容:1、实例构造函数,2、静态构造函数,3、私有构造函数在 C# 中,构造函数就是与类(或结构体)具有相同名称的成员函数,它在类中的地位比较特殊,不需要我们主动调用,当创建一个类的对象时会自动调用类中的构造函数。在程序开发的过程中,我们通常使用类中的构造函数来初始化类中的成员属性。 C# 中的构造函数有三种: 实例构造函数; 静态构造函数; 私有构造函数。 1、实例构造函数 构造函数是类中特殊的成员函数,它的名称与它所在类的名称相同,并且没有返回值。当
主要内容:构造函数的重载,默认构造函数在 C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是 构造函数(Constructor)。 在《 C++类成员的访问权限以及类的封装》一节中,我们通过成员函数 setname()、setage()、setscore() 分别为成员变量 name、age、score 赋值,这样做虽然有效,但显得有点