Cpp :: Custom Exceptions, Сообщение переменной не перехвачено (<< оператор) - PullRequest
0 голосов
/ 07 июня 2018

Привет, у меня сейчас проблема с моим классом / макросом Exception.

Итак, сначала образец файла, чтобы показать, что я имею в виду.

#include <iostream>
#include <string>

class ExceptionHelper : public std::exception {
public:
  ExceptionHelper(std::string msg) : std::exception(), msg_(msg) {}

  ExceptionHelper operator<<(std::string const &value) {
    msg_.append(" :: ");
    msg_.append(value);
    return ExceptionHelper(msg_);
  }

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

private:
  std::string msg_;
};

#define DEFINE_EXCEPTION(ClassName, Message)                                   \
  class ClassName : public ExceptionHelper {                                   \
  public:                                                                      \
    ClassName(std::string msg = Message) : ExceptionHelper(msg) {}             \
  };

DEFINE_EXCEPTION(Test, "Testmessage")

int main() {
  try {
    throw Test();
  } catch (Test &e) {
    std::cout << "I was caught 1 " << e.what() << std::endl;
  }

  try {
    throw(Test() << "Something added");
  } catch (Test &e) {
    std::cout << "I was caught 2 " << e.what();
  } catch (std::exception &e) {
    std::cout << "should not be called " << e.what() << std::endl;
  }

  try {
    Test t;
    t << "Something added";
    throw t;
  } catch (Test &e) {
    std::cout << "I was caught 3 " << e.what();
  } catch (std::exception &e) {
    std::cout << "should not be called2" << e.what() << std::endl;
  }
}

Разные версии отключены <<оператор (не отличающийся от выходных данных): </p>

ExceptionHelper& operator<<(std::string const &value) {
        msg_.append(" :: ");
        msg_.append(value);
        return *this;
      }
ExceptionHelper operator<<(std::string const &value) {
            msg_.append(" :: ");
            msg_.append(value);
            return *this;
          }

Выходные данные:

I was caught 1 Testmessage
should not be called Testmessage :: Something added
I was caught 3 Testmessage :: Something added

Требуемые выходные данные:

I was caught 1 Testmessage
I was caught 2 Testmessage :: Something added
I was caught 3 Testmessage :: Something added

Поэтому я хотел бы создать SpecialКлассы исключений с моим макросом DEFINE_EXCEPTION, который прекрасно работает.

Теперь я хотел бы добавить дополнительную информацию к новому типу исключений.(Это было бы удобно для отладки, поскольку это позволило бы мне написать что-то вроде throw Test () << "Переменная x:" + std :: to_string (x)) </p>

Это показано в случае 2 восновной метод.Здесь перехватывается только std :: exception, а не Test test.

Если я делаю это, как в третьем примере, в основном, он работает нормально.

Я пробовал много стилей на <<оператор, но я нашел не, что имеет значение. </p>

Я был бы заинтересован в решении, которое позволяет этот синтаксис.Также приветствуется информация о том, почему это не работает.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Спасибо за подсказку:) ... длинный день.

Здесь, если кто-то заинтересован в рабочей версии.

class ExceptionHelper : public std::exception {
public:
  ExceptionHelper(std::string msg) : std::exception(), msg_(msg) {}
  virtual const char *what() const throw() { return msg_.c_str(); }

protected:
  std::string msg_;
};

#define DEFINE_EXCEPTION(ClassName, Message)                                   \
  class ClassName : public ExceptionHelper {                                   \
  public:                                                                      \
    ClassName(std::string msg = Message) : ExceptionHelper(msg) {}             \
                                                                               \
    template<class T>                                                          \
    ClassName &operator<<(T const &value) {                                    \
      msg_.append(" :: ");                                                     \
      msg_.append(value);                                                      \
      return *this;                                                            \
    }                                                                          \
  };
0 голосов
/ 07 июня 2018

ExceptionHelper::operator << возвращает тип ExceptionHelper, который не был пойман.

Чтобы проверить это, добавьте улов для ExceptionHelper.

Определите operator << в вашем Class для решения проблемы.

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