exponenta event banner

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

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. На панели «Источник» щелкните ключевое слово правой кнопкой мыши. catch и выберите Поиск "catch"в текущем исходном файле.

  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
Воздействие: среднее
ИДЕНТИФИКАТОР CWE: 755
Представлен в R2015b