Привет, у меня сейчас проблема с моим классом / макросом 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>
Я был бы заинтересован в решении, которое позволяет этот синтаксис.Также приветствуется информация о том, почему это не работает.