Обработка ошибки и передача через поток char

126
02 июля 2019, 06:10

Функция конвертирует std::string в тип T. Передача "-1" в числовые типы считается ошибкой. Передача "Abc" в char тоже.

template<class T>
T from_string(std::string const& s)
{
    try
    {
        T obj;
        if (! (std::istringstream(s) >> std::noskipws >> obj) ) throw new bad_from_string(s);
        return obj;
    }
    catch (const std::exception& ex) {}
}

Обработчик ошибок:

class bad_from_string : public std::runtime_error
{
public:
    bad_from_string(const char* msg) : std::runtime_error(msg) {}
    bad_from_string(std::string const& msg) : std::runtime_error(msg.c_str()) {}
    const char* msg;
};

Вопрос: как отловить передачу в char более, чем одного символа и передачу в численные типы числа со знаком "-"?

В отмеченных случаях char должен выдавать ошибку

Answer 1

Начнем с вашего класса:

Во первых неинициализирован указатель msg, не говоря о том, что он тут вообше не нужен.

Во вторых, класс, хранящий указатель, должен иметь определение деструктора, КК и ОП.

И наконец: std::runtime_error принимает как С_строку, так и std::string, а последный, в свою очередь может инициализироваться С_строкой, так что одного единственного конструктора достаточно. И старайтесь придать разные имена аргументу конструктора и члену класса, чтобы потом самы не запутались. Нормально bad_from_string может выглядеть:

struct bad_from_string : public std::runtime_error
{   
    bad_from_string(std::string const& msg) : std::runtime_error(msg) {}    
};

Теперь о вашей функции: она генерирует исключение и сама же ловит. Во первых смысла в этом абсолютно нет, поскольку исключения генерируются, чтобы вызывающая функция обрабатывала и получала нужный результат. Во вторых: если исключение поймано, то ваша функция не закончит свою работу, а значит не вернет ничего, но она должна возвращать обьект.

Так что уберите try/catch из функции и включите в программу(вызывающую функцию). А если вы хотите читать из потока так, как вам хочется, то нужно написать еще и парсер.

P.S. Чуть не забыл: не нужно генерировать исключение, созданное в куче, поскольку в этом нет нужды, плюс иначе вам придется не забывать производить удаление в обработчике, и вы все таки пытаетесь обработать не по указателью, а по ссыльке.

READ ALSO
QProcess error QT c++

QProcess error QT c++

Всем приветЕсть вот такой код:

121
Не назначил что-то в функции

Не назначил что-то в функции

Не понимаю почему компилятор выдаёт, что я не назначил что-то в функцииОбъясните, как это делать правильно (уже который раз с этим сталкиваюсь)

123
Как удалить идущие подряд дубликаты в списке?

Как удалить идущие подряд дубликаты в списке?

У меня есть List<String> со значениями например ["a", "a", "a", "b", "c", "c", "d", "d", "d"] из него должно получиться ["a", "b", "d"]Причём, если после удаления дубликатов...

133