Exception handler hidden by previous handler

catch оператор не достигнут из-за более раннего catch оператор для того же исключения

Описание

Этот дефект происходит когда catch оператор не достигнут потому что предыдущий catch оператор обрабатывает исключение.

Например, catch оператор принимает объект класса my_exception и более поздний catch оператор принимает одно из следующего:

  • Объект my_exception класс.

  • Объект класса выведен из my_exception класс.

Риск

Поскольку catch оператор не достигнут, это - эффективно мертвый код.

Фиксация

Одна возможная фиксация должна удалить избыточный catch оператор.

Другой возможная фиксация должен инвертировать порядок catch операторы. Поместите catch оператор, который принимает исключение производного класса перед catch оператор, который принимает исключение базового класса.

Примеры

развернуть все

#include <new>

extern void print_str(const char* p);
extern void throw_exception();

void func() {
    try {
        throw_exception();
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }

    catch(std::bad_alloc& exc) {
        print_str(exc.what());
    }
}

В этом примере, втором catch оператор принимает std::bad_alloc объект. Поскольку std::bad_alloc класс выведен из std::exception класс, второй catch оператор скрыт предыдущим catch оператор, который принимает std::exception объект.

Дефект появляется на типе параметра catch оператор. Найти который catch оператор скрывает текущий catch оператор:

  1. На панели Source щелкните правой кнопкой по ключевому слову catch и выберите Search For "catch"in Current Source File.

  2. На панели Search кликните по каждому результату поиска, продолжив назад от текущего catch оператор. Продолжите, пока вы не найдете catch оператор, который скрывает catch оператор с дефектом.

Коррекция — переупорядочивает catch Оператор

Одна возможная коррекция должна поместить catch оператор параметром производного класса сначала.

#include <new>

extern void print_str(const char* p);
extern void throw_exception();

void corrected_excphandlerhidden() {
    try {
        throw_exception();
    }
    
    catch(std::bad_alloc& exc) {
        print_str(exc.what());
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }
}

Информация о результате

Группа: исключение C++
Язык: C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: EXCP_HANDLER_HIDDEN
Удар: носитель
ID CWE: 755
Введенный в R2015b