Обработчик исключений скрыт предыдущим обработчиком

Оператор 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++
Значение по умолчанию: на
Синтаксис командной строки: EXCP_HANDLER_HIDDEN
Влияние: носитель
ID CWE: 755

Введенный в R2015b