V1022. Exception was thrown by pointer. Consider throwing it by value instead.
Анализатор обнаружил исключение, брошенное по указателю. Чаще всего принято бросать исключения по значению, а перехватывать по ссылке. Бросание указателя может привести к тому, что исключение не будет поймано, так как перехватывать его будут по ссылке. Также использование указателя вынуждает перехватывающую сторону вызвать оператор 'delete' для уничтожения созданного объекта, чтобы не возникали утечки памяти.
Пример:
throw new std::runtime_error("error");
Корректный код:
throw std::runtime_error("error");
Конечно, само по себе бросание исключения по указателю не является ошибкой. Такое исключение можно правильно перехватить и обработать. Однако на практике это неудобно и провоцирует ошибки. Недостатки использования указателя:
- Надо самостоятельно заботиться об уничтожении объекта, вызывая оператор 'delete'.
- Нельзя использовать 'catch(...)', так как непонятно, как уничтожить объект.
- Это нестандартный способ сообщить об ошибке, и другие части программы могут неправильно обрабатывать исключения.
- Если кончилась динамическая память, то попытка создать новый объект с помощью 'new' также может окончиться неудачей.
Таким образом, бросание исключения по указателю можно считать ошибочным паттерном и такой код следует переписать.
Дополнительные ссылки:
- Обсуждение на сайте Stack Overflow. throw new std::exception vs throw std::exception.
- Обсуждение на сайте Stack Overflow. C++: Throwing exceptions, use 'new' or not?
- Обсуждение на сайте Stack Overflow. c++ exception : throwing std::string.
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1022. |