Анализатор обнаружил создание объекта исключения без поясняющего сообщения. Такой подход может привести к недостаточному логированию и затруднить процесс выявления ошибок.
Рассмотрим следующий пример:
void DoSomething(const char *val)
{
if (!val) throw std::runtime_error { "" };
// do something...
}
void foo()
{
const char *val = ....;
try
{
DoSomething(val);
}
catch(std::runtime_error &err)
{
std::cerr << err.what() << std::endl;
}
}
В функции 'DoSomething' выбрасывается исключение 'std::runtime_error', которое будет обработано в функции 'foo'. В процессе обработки ожидается, что в 'std::cerr' попадёт информация о причине создания исключения. Вместо этого в 'std::cerr' будет выдана пустая строка, что затруднит процесс обнаружения проблемы.
Корректный вариант может выглядеть так:
void DoSomething(const char *val)
{
if (!val)
{
throw std::runtime_error{ "[DoSomething]: "
"the poiner 'val' is nullptr." };
}
// do something...
}
Анализатор сгенерирует предупреждение V1116, если обнаружит создание стандартного исключения без поясняющего сообщения. Если вы хотите обнаруживать подобные ситуации для пользовательских исключений, то можете воспользоваться механизмом пользовательских аннотаций.