Поврежденное сообщение в пользовательском исключении - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь реализовать исключение пользовательского класса.

Само исключение работает, но я получаю поврежденный вывод

#include <stdexcept>

namespace Exception{

class LibraryException : public std::runtime_error
{
public:
   explicit LibraryException(const std::string& message)
      : std::runtime_error(""),
        prefix_("LibraryException: "),
        message_(message)
   {
   }

   const char* what() const noexcept override
   {
      std::string out;
      out += prefix_;
      out += message_;
      return out.c_str();
   }

private:
   std::string prefix_;
   std::string message_;
};

class BadSizeException : public LibraryException
{

public:
   explicit BadSizeException() : LibraryException("Library: Bad Size\n")
   {
   }
};
}

Вывод, когда я пытаюсь вызвать исключение:

° исключение: плохой размер

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Как сказал Дрю, вы использовали локальный указатель объекта вне его области видимости. Возможное решение.

class LibraryException : public std::runtime_error
{
public:
   explicit LibraryException(const std::string& message)
      : std::runtime_error(""),
        prefix_("LibraryException: "),
        message_(message)
   {
   }

   const char* what() const noexcept override
   {
      buffer_ = prefix_ + message_;
      return buffer_.c_str();
   }

private:
   std::string prefix_;
   std::string message_;
   mutable std::string buffer_;  // Now buffer will live between what() calls.
};

mutable из-за постоянства what(). Таким образом, вы можете изменить значение buffer_.

0 голосов
/ 02 мая 2018

Что я делаю не так?

Вы возвращаете указатель на временный объект.

   const char* what() const noexcept override
   {
      std::string out;
      out += prefix_;
      out += message_;
      return out.c_str();
   }

Указатель, возвращаемый из out.c_str(), действителен только тогда, когда out действителен.

Чтобы исправить это, вам нужно будет вызвать .c_str() для строки, которая имеет то же время жизни, что и исключение, например, переменную-член.

...