Анализатор обнаружил множественные обработчики исключений с нарушенным порядком следования. Обработчик для базового класса исключений размещен перед обработчиком для производного класса. В таком случае все исключения, предназначенные для перехвата обработчиком производного класса, будут перехвачены обработчиком для базового класса.
Рассмотрим пример:
class Exception { .... }; class DerivedException : public Exception { ... }; void foo() { throw DerivedException; } void bar() { try { foo(); } catch (Exception&) { // Все исключения, имеющие тип DerivedException попадут сюда } catch (DerivedException&) { // Код в этом обработчике никогда не выполняется } }
Так как класс 'Exception' является базовым для класса 'DerivedException', исключения, которые генерирует функция 'foo()', перехватываются первым обработчиком.
Чтобы исправить ошибку, нужно поменять обработчики исключений местами:
void bar() { try { foo(); } catch (DerivedException&) { // Перехватывает исключения типа DerivedException } catch (Exception&) { // Перехватывает исключения типа Exception } }
Теперь каждый обработчик перехватывает исключения, предназначенные только для него.
Данная диагностика классифицируется как:
|