繁体   English   中英

C ++:如何将参数传递给自定义异常?

[英]C++: How to pass parameters to custom exceptions?

我创建了一个自定义异常:

class MyIOException : public std::exception
{
public:
  virtual const char* what() const throw()
  {
    return "IO Exception";
  } 
};

class MyEmptyImageException : public MyIOException
{
private:
  std::string m_bucketName;
  std::string m_objectName;

public:

  MyEmptyImageException(const std::string& bn, const std::string& on) : m_bucketName(bn), m_objectName(on) {}
  virtual const char* what() const throw()
  {
    std::string msg = "Empty Image : " + m_bucketName + m_objectName;
    return msg.c_str();
  }  
};

我试试这样:

int main(int argc, char** argv)
{
  try
  {
    // ... read image
    if (image.empty)
    {
      throw MyEmptyImageException(folderName, imageName);
    }
    // ... remained code
  }
  catch (MyEmptyImageException& meie)
  {
    std::cout << meie.what() << std::endl;
  }
  catch (std::exception& e)
  {
    std::cout << e.what() << std::endl;
  }
  return 0;
}

我不确定我是否做得对,你能纠正我,还是建议更好的实现,因为我是使用派生异常的初学者?

您已将参数正确传递给异常类的构造函数。

但是 ,函数MyEmptyImageException::what()是不正确的,因为它返回msg.c_str() ,其中msg在堆栈上分配。 当函数what()返回时,它们的msg对象被销毁,而char*指针指向由释放的对象管理的缓冲区。 要解决这个问题,您可以在MyEmptyImageException本身的构造函数中构造消息:

class MyEmptyImageException : public MyIOException
{
  std::string m_msg;
public:

  MyEmptyImageException(const std::string& bn, const std::string& on)
    : m_msg(std::string("Empty Image : ") + bn + on)
  {}

  virtual const char* what() const throw()
  {
    return m_msg.c_str();
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM