我在下面有自定义异常类:
#include <exception>
#pragma once
class MyException : public std::exception
{
public:
MyException ();
MyException (std::string message="");
virtual const char* what()throw();
private:
std::string m_exceptionMessage;
};
相应的 .cpp 文件具有正确的定义。
下面是我的函数是如何嵌套的:
f1();
f2();
void main()
{
try
{
f1();
}
catch (std::exception &ex)
{
std::cerr << ex.what() << std::endl;
}
}
void f1()
{
try
{
f2();
}
catch (std::exception &ex)
{
throw std::exception(ex);
}
}
void f2()
{
try
{
InitCalculations();
hr = DoSomething();
if(hr!=S_OK)
throw MyException ("invalid argument")
}
catch (std::exception &ex)
{
throw std::exception(ex);
}
}
我试图总结问题。所有功能都位于不同标题下的不同文件中。我将正确的消息传递给函数 f2()
中的第一个 catch,但是当我尝试传播此消息时,我在 f1()
中丢失了它,因此在 主要()
将来自 f2()
的异常传播到 main()
函数的正确方法是什么?
最佳答案
throw std::exception(ex);
创建一个新的异常对象,它不再是 MyException
。这就是你丢失消息的原因。您只需要使用 throw;
,它会重新抛出现有捕获的异常。
还有,顺便说一句。您不应该使用 std::string
或任何其他从异常中的堆分配的对象。程序可能因内存不足而抛出异常,std::string
将抛出另一个异常,因为它无法分配缓冲区,导致程序退出。
使用 const char *
文字,如果您需要可变文本,请使用静态分配的 char[]
缓冲区并使用 sprintf()
填充它。
关于c++ - 从嵌套函数 C++ 中抛出自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50108284/