c++ - 通过在构造函数主体之前抛出异常来防止构造

标签 c++ exception constructor throw ctor-initializer

C++

我希望一个类在其构造函数主体的左大括号 { 之前抛出异常,方法是使用其自己的成员函数来阻止构造。我定义了一个成员函数,其目的只是无条件地抛出异常,具有任意选择的非void返回类型和一个类型与该返回类型匹配的虚拟数据成员,这样我就可以通过调用构造函数初始化列表中的所述成员函数构造此数据成员来触发 throw。这行得通但并不优雅,因为在非玩具类中,虚拟变量除了为成员函数运行提供借口外别无他用,并且成员函数的非 void 返回type 没有其他目的,只是有一个借口让它可以被相同类型的虚拟数据成员的构造函数调用。

这个玩具可以编译但不够优雅:

class Toy
{
public:
    Toy() : dummy(preventer()) {}
private:
    int dummy;
    int preventer() {throw -1; return 0;}
};

#include <iostream>

int main()
{
    try
    {
        Toy t;
    }
    catch (const int& e)
    {
        std::cout << "caught the exception\n";
    }
    return 0;
}

控制台输出:

caught the exception

如果没有虚拟变量,有没有办法在构造函数主体的左花括号 { 之前抛出异常?

最佳答案

是的,您可以使用基类而不是数据成员,然后调用基类的构造函数。

请注意,旧版本的 GNU 调试器 gdb(几年前)无法中断此类异常。

但是,可以与 Visual C++ 一起使用,而且我相信也可以与现代版本的 GNU 工具链一起使用。

关于c++ - 通过在构造函数主体之前抛出异常来防止构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673132/

相关文章:

c++ - 为什么不使用范围解析运算符调用基类构造函数

java - NoElementException 但我打印元素并得到预期结果

java - 您如何处理/记录 Java MVC Web 应用程序中的错误?

java - Java 中的接口(interface)、类和构造函数

c++ - 服务器如何知道客户端仍处于连接状态?

c++ - move 分配给自己的行为

c++ - Wt C++ root() 返回 Null

java - 避免java中的特定异常

javascript - 基本的文字格斗游戏javascript

带参数列表的 C++ 构造函数