我创建了一个自定义异常:
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;
}
我不确定我是否做得对,你能纠正我,还是建议更好的实现,因为我是使用派生异常的初学者?
答案 0 :(得分:12)
您已将参数正确传递给异常类的构造函数。
但是,函数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();
}
};