C++ 捕获从匿名命名空间初始化引发的异常

C++ 捕获从匿名命名空间初始化引发的异常,c++,C++,当从匿名命名空间中构造的类的构造函数引发异常时,我收到一个未处理的异常错误。如何捕获异常?下面是一个简化的错误示例,试图在Main.cpp中捕获该错误: Main.cpp: #include "Exception.hpp" #include "Namespace.hpp" int main() try { return 0; } catch(Exception exception) { exception.show(); return 1; } Exception.h

当从匿名命名空间中构造的类的构造函数引发异常时,我收到一个未处理的异常错误。如何捕获异常?下面是一个简化的错误示例,试图在Main.cpp中捕获该错误:

Main.cpp:

#include "Exception.hpp"
#include "Namespace.hpp"

int main()
try
{
    return 0;
}
catch(Exception exception)
{
    exception.show();
    return 1;
}
Exception.hpp:

#pragma once

#include <iostream>
#include <string>

class Exception
{
    std::string m_error;

public:
    Exception(std::string error) : m_error(error){};
    void show(){ std::cout<<m_error<<"\n"; }
};
Namespace.cpp:

#include "Namespace.hpp"

#include "Class.hpp"

namespace
{
    Class test_class{};
};
1.hpp级:

#pragma once

#include "Exception.hpp"

class Class
{
public:
    Class(){ throw Exception{"Error Message\n"}; }
};

问题是,您在匿名名称空间中声明的变量与任何其他全局变量一样,它是在调用
main
之前构造的,因此在没有任何人能够捕获它的情况下引发异常。

1。构造函数不应该抛出异常。2.您的代码不会抛出exception@EdHeal:“构造函数不应该抛出异常”-如果初始化失败,当然应该抛出异常。否则您会如何表示失败?@SelymAI像Ed Heal评论的那样,不要在构造函数中抛出异常。相反,添加可以引发异常的辅助
init
open
函数。此外,它与您在构造函数中所做的不一样,如果您创建了类的全局变量,那么它的构造函数将在调用
main
之前被调用。
#pragma once

#include "Exception.hpp"

class Class
{
public:
    Class(){ throw Exception{"Error Message\n"}; }
};