当前位置: 首页 > 知识库问答 >
问题:

捕获C中构造函数抛出的错误?

柳鸿信
2023-03-14

我有一个类foo(我不能修改),它只有一个构造函数,它接受一个参数,如下所示:

foo bar("Hello!");

由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是:

try {
    foo bar("Hello!");
}
catch {
    cerr << "Something went horribly wrong...";
    return -1;
}

但是,现在footry块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在try块之外声明bar。那么,我该如何捕捉构造函数抛出的错误呢?

编辑:为了澄清,这是在我的main中,在catch中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输入永远不会引发异常。

共有2个答案

柏修洁
2023-03-14

您可以使用堆分配:

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)
颛孙炜
2023-03-14

问题相当简单:构造函数失败了,因此从未创建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 赋值,这样做虽然有效,但显得有点