Я начал использовать исключения несколько недель назад, и теперь мне интересно, есть ли способ просто выдать предупреждение. Это предупреждение не должно заставлять приложение закрываться, если оно не перехвачено. Я дам вам пример, в какой ситуации я хотел бы использовать это.
Существует система, которая добавляет свойства к уникальным идентификаторам. Когда я каким-то образом пытаюсь добавить свойство к еще не существующему идентификатору, система должна создать этот идентификатор для меня, добавить свойство к нему и вернуть результат. Конечно, это не может быть сделано спокойно. Но поскольку приложение может оставаться запущенным, я не хочу бросать исключение.
Как я могу сообщить, что что-то было не совсем правильно, но система работает?
Кого вы хотите уведомить? Конечный пользователь? В этом случае просто напишите подходящее сообщение cerr
, Или лучше написать функцию-обертку (например, LOG_WARNING()
) сделать это контролируемым образом. Или еще лучше, используйте каркас регистрации.
Но поскольку приложение может оставаться запущенным, я не хочу бросать исключение.
Обратите внимание, что исключение не должно приводить к завершению приложения. Вы можете поймать исключение выше по стеку и соответствующим образом обработать ситуацию.
Пока нет предупреждения. Я считаю, что функциональность, которую вы ищете, доступна от errno
Вы можете установить его на любой из стандартные ошибки или создайте свои собственные коды ошибок. (Пожалуйста, документируйте их хорошо, хотя.)
Это может быть полезно, если ваша библиотека предназначена для использования другими разработчиками. Примером, когда это может быть полезно, является анализатор JSON. JSON поддерживает произвольно большие числа с произвольной точностью. Так что, если внутри вашего парсера используются двойные числа для представления чисел, если он встретил число, которое он не может представить, то он может округлить число до ближайшего представимого числа — набора errno=EDOM;
(аргумент вне диапазона), таким образом, он оставляет за разработчиками решение о том, имеет ли значение округление. Если вы хотите быть супер милым, вы можете даже добавить способ получения местоположения раундов, возможно даже с оригинальным текстом.
Все это говорит о том, что это следует использовать только в ситуациях, когда:
Просто распечатайте сообщение в stderr или в ваш лог.
Нет, это невозможно. Вы можете только бросать и ловить исключения. Если ты хочешь быть нахальный ты мог бы сделать
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");
Если хотите, это может быть искусственно созданная система оповещения.