C++ 捕获从匿名命名空间初始化引发的异常
当从匿名命名空间中构造的类的构造函数引发异常时,我收到一个未处理的异常错误。如何捕获异常?下面是一个简化的错误示例,试图在Main.cpp中捕获该错误: Main.cpp: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
#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"}; }
};