Exception handler hidden by previous handler

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

Описание

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

Для образца, a 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: EXCP_HANDLER_HIDDEN
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 755
Введенный в R2015b