Как сделать свой собственный класс ошибок во время выполнения? - PullRequest
7 голосов
/ 11 сентября 2010

Я пытаюсь сделать простой пользовательский 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 ]

14 голосов
/ 11 сентября 2010

Это потому, что вы бросаете указатель.Просто сделайте: throw FileNotFoundException(msg);.

Всякий раз, когда вы используете указатель, если вы не помещаете его в контейнер / обертку, вы, вероятно, делаете неправильно.

5 голосов
/ 11 сентября 2010

Вы пишете throw new FileNotFoundException(msg), это должно быть 'throw FileNotFoundException (msg)'. Правило «бросить по значению», «поймать по ссылке».

3 голосов
/ 11 сентября 2010

Вы на самом деле бросаете указатель на выделенный объект кучи (FileNotFoundException *), поэтому типы не совпадают.Как правило, бросить по значению и поймать по ссылке ( правило 73 ).

1 голос
/ 11 апреля 2013

Кстати, со следующим объявлением вы создаете копию строки msg.

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

Вместо этого напишите "const std :: string & msg". Это поместит просто ссылку в стек. Пока вы кладете всю строку в стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...