Как добавить к какой строке std :: runtime_error - PullRequest
0 голосов
/ 20 февраля 2019

В библиотеке C ++, которую я пишу, я расширил std :: runtime_error (просто для того, чтобы иметь уникальный тип - мне ничего не нужно, кроме what-string).Но иногда я хочу перехватить исключение в точке входа пользователя, чтобы добавить дополнительную контекстную информацию к строке what, а затем перебросить ее.Но, похоже, в любом случае нет возможности изменить строку what из runtime_error.Почему так устроено?Чтобы избежать возможного состояния нехватки памяти во время перераспределения внутреннего строкового буфера (что приведет к новому исключению)?Или они просто хотят поощрять использование вложенных исключений для подобных вещей?(Вложенные исключения кажутся излишне громоздкими, поскольку все они находятся в контексте одной библиотеки, но, возможно, я ошибаюсь.) Мой текущий подход заключается в переопределении виртуального метода what и возвращении моей собственной (добавляемой) строки:

#include <stdexcept>
#include <string>

class MyException : public std::runtime_error
{
    public:
        explicit MyException(const std::string& what_arg) :
                MyException(what_arg.data())
        {
        }

        explicit MyException(const char* what_arg) :
                runtime_error(""),
                what_("MyException:  ")
        {
            append(what_arg);
        }

        const char* what() const noexcept
        {
            return what_.data();
        }

        void append(const char* msg)
        {
            what_.append(msg);
        }

        void append(const std::string& msg)
        {
            what_.append(msg);
        }

    private:
        // As near as I can tell, there is no way to modify the what arg
        // of runtime_error, so I don't use it and make make my own what
        // arg here.
        //
        std::string what_;
};

Так этот подход злой?Есть ли лучший способ?

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