Как выдать сообщение об ошибке с аргументом?

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

throw std::out_of_range("Empty tree");

Я борюсь с другой ошибкой, которую я должен выдать, а именно:

"Cannot find ceil for key <key>" 

Как видите, я должен включить ключ, для которого я не могу найти потолок. У меня есть ключ как переменная в функции, из которой я генерирую исключение, но я не знаю, как включить его в то, что в конечном итоге будет напечатано e.what ().

Обновлено: это функция шаблона как член класса, поэтому сейчас ключ просто типа T. Поэтому я думаю, что форматирование его как строки c не работает.

Что это за тип key?

NathanOliver 30.10.2018 21:14

Используйте std::string для создания сообщения.

drescherjm 30.10.2018 21:14

Вам понадобится какая-то функция stringify, которая преобразует все, что есть T, в std::string. Тогда вы можете использовать его как throw std::out_of_range("Cannot find ceil for key " + stringify(key));

NathanOliver 30.10.2018 21:22

Вам нужно уточнить, что такое объект key. Пожалуйста, опубликуйте код для этого.

Cortex0101 30.10.2018 21:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
202
1

Ответы 1

Стандартные исключения принимают в качестве аргумента только строку:

например вне зоны доступа, см. документы apache.org

namespace std {
  class out_of_range : public logic_error {
  public:
    explicit out_of_range(const string&  what_arg);
  };
}

Вы можете использовать любой метод для предварительного построения строки, а затем передать его в качестве параметра исключению.

Пример:

#include <string>
#include <sstream>
#include <stdexcept>

std::ostringstream oss;
oss << "Cannot find ceil for key " << key;
std::string errorString = oss.str();

throw std::out_of_range(errorString);

Чтобы узнать о других способах создания строки, см. C++ создает строку текста и переменных.

Другие вопросы по теме