如何做我自己的自定义运行时错误类?

时间:2010-09-10 21:06:26

标签: c++ exception

我正在尝试做一个简单的自定义runtime_error。我定义了这个类:

#include <string>
#include <stdexcept>


namespace utils{

 class FileNotFoundException: public std::runtime_error{
  public:
   FileNotFoundException():runtime_error("File not found"){}
   FileNotFoundException(std::string msg):runtime_error(msg.c_str()){}
 };

};

然后我抛出错误:

bool checkFileExistence( std::string fileName )
 {
  boost::filesystem::path full_path = boost::filesystem::system_complete(boost::filesystem::path(fileName));
  if (!boost::filesystem::exists(full_path))
  {
    char msg[500];
    _snprintf(msg,500,"File %s doesn't exist",fileName.c_str());
    throw new FileNotFoundException(msg);
  }
 }

我使用try / catch块

    try{
          checkFileExistence(fileName);
     }
   catch(utils::FileNotFoundException& fnfe)
        {
          std::cout << fnfe.what() << std::endl;
     }

运行时错误被正确抛出为FileNotFoundException,但是从未到达带有std :: cout的行,并且没有行被写入控制台。

欢迎所有想法。 谢谢!

4 个答案:

答案 0 :(得分:14)

那是因为你扔了一个指针。只需:throw FileNotFoundException(msg);

每当你使用指针时,除非你把它放入容器/包装器中,否则你可能没做正确的事。

答案 1 :(得分:5)

你写throw new FileNotFoundException(msg),它应该是'throw FileNotFoundException(msg)'。该规则是按值抛出,通过引用捕获。

答案 2 :(得分:3)

实际上,您正在向堆分配的对象(FileNotFoundException *)抛出指针,因此类型不匹配。通常,按值抛出并按引用捕获(rule 73)。

答案 3 :(得分:1)

BTW,使用以下声明,您可以创建msg字符串的副本。

FileNotFoundException(std::string msg):runtime_error(msg.c_str()){}

改为编写“const std :: string&amp; msg”。它只会在堆栈上放置一个引用。现在你将整个字符串放在堆栈上。