c++ - 从嵌套函数 C++ 中抛出自定义异常

标签 c++ exception

我在下面有自定义异常类:

#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/

相关文章:

c++ - 如何在 boost HTML3 示例中向服务器发送 SIGTERM 或 SIGINT 信号?

c++ - 为什么这个 const const const 声明有效

c++ - 多进程c++的锁机制

java - Throwable getMessage() 的奇怪输出

java - 抛出什么异常 - "Wrong Scenario"(Java)

c++ - 为什么我计算邻接矩阵的算法在只应使用 0 和 1 时输出 '8'?

c++ - 如何初始化静态模板化容器?

python - 导入时tftpy包语法错误

c++ - 函数 try block 的目的是什么?

c# - 在哪里可以找到有关类和方法抛出的异常的信息?