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

Я начал использовать исключения несколько недель назад, и теперь мне интересно, есть ли способ просто выдать предупреждение. Это предупреждение не должно заставлять приложение закрываться, если оно не перехвачено. Я дам вам пример, в какой ситуации я хотел бы использовать это.

Существует система, которая добавляет свойства к уникальным идентификаторам. Когда я каким-то образом пытаюсь добавить свойство к еще не существующему идентификатору, система должна создать этот идентификатор для меня, добавить свойство к нему и вернуть результат. Конечно, это не может быть сделано спокойно. Но поскольку приложение может оставаться запущенным, я не хочу бросать исключение.

Как я могу сообщить, что что-то было не совсем правильно, но система работает?

2

Решение

Кого вы хотите уведомить? Конечный пользователь? В этом случае просто напишите подходящее сообщение cerr, Или лучше написать функцию-обертку (например, LOG_WARNING()) сделать это контролируемым образом. Или еще лучше, используйте каркас регистрации.


Но поскольку приложение может оставаться запущенным, я не хочу бросать исключение.

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

3

Другие решения

Пока нет предупреждения. Я считаю, что функциональность, которую вы ищете, доступна от errno

Вы можете установить его на любой из стандартные ошибки или создайте свои собственные коды ошибок. (Пожалуйста, документируйте их хорошо, хотя.)

Это может быть полезно, если ваша библиотека предназначена для использования другими разработчиками. Примером, когда это может быть полезно, является анализатор JSON. JSON поддерживает произвольно большие числа с произвольной точностью. Так что, если внутри вашего парсера используются двойные числа для представления чисел, если он встретил число, которое он не может представить, то он может округлить число до ближайшего представимого числа — набора errno=EDOM; (аргумент вне диапазона), таким образом, он оставляет за разработчиками решение о том, имеет ли значение округление. Если вы хотите быть супер милым, вы можете даже добавить способ получения местоположения раундов, возможно даже с оригинальным текстом.

Все это говорит о том, что это следует использовать только в ситуациях, когда:

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

Просто распечатайте сообщение в stderr или в ваш лог.

0

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

class warning : public std::exception
{
public:
warning(const std::string& msg) {}
const char* what() { return msg.c_str(); } //message of warning
private:
std::string msg;
};

Тогда ты можешь:

throw warning("this is a warning");

Если хотите, это может быть искусственно созданная система оповещения.

0
По вопросам рекламы [email protected]