Uncaught exception

Исключение распространяет uncault на main или другая функция точки входа

Описание

В этой проверке рассматриваются следующие проблемы:

  • Неотключенное исключение распространяется на main или другая функция точки входа.

  • Исключение выдается в конструкторе глобальной переменной, а не получено.

  • Исключение выдается при вызове деструктора или delete выражение.

  • Исключение выдается перед обработкой предыдущего выражения метания catch оператор, например, при построении catch параметры оператора.

  • A noexcept спецификация нарушена. Для образца - функция, объявленная с noexcept(true) не должен выдавать никаких исключений, но исключение выдается в теле функции.

В этих ситуациях, согласно стандарту C++, std::terminate функция вызывается и может вызвать неожиданные результаты.

Обратите внимание, что проверка Uncaught exception функций из библиотеки стандартных шаблонов зеленого цвета, хотя Polyspace заглушает эти функции и не проверяет, выдает ли функция исключение.

Примеры

расширить все

#include <vector>
using namespace std;

class error {};

class initialVector {
private:
  int sizeVector;
  vector<int> table;
public:
  initialVector(int size) {
    sizeVector = size;
    table.resize(sizeVector);
    Initialize();
  }
  void Initialize();
  int getValue(int number) throw(error);
};

void initialVector::Initialize() {
  for(int i=0; i<table.size(); i++)
    table[i]=0;
}

int initialVector::getValue(int index) throw(error) {
  if(index >= 0 && index < sizeVector)
    return table[index];
  else throw error();
}

void main() {
    initialVector *vectorPtr = new initialVector(5);
    vectorPtr->getValue(5);
}

В этом примере вызов метода initialVector::getValue выдает исключение. Это исключение распространяет uncaugh на main функция, приводящая к красной проверке Uncaught exception.

class error {
public:
  error() {  }
  error(const error&) { }
};


void funcNegative() {
  try {
    throw error() ;
  } catch (error NegativeError) {
  }
}

void funcPositive() {
  try {
  }
  catch (error PositiveError) {
  /* Gray code */
  }
}

int input();
void main()
{
    int val=input();
    if(val < 0)
        funcNegative(); 
    else
        funcPositive(); 
}

В этом примере:

  • Вызов funcNegative выдает исключение. Однако исключение помещается в try блок и захватывается соответствующим обработчиком (catch пункт). Проверка Uncaught exception на main функция выглядит зеленой, потому что исключение не распространяется на main.

  • Вызов funcPositive не выдает исключение в try блок. Поэтому catch блок, следующий за try блок выглядит серым.

class error {
};

class X
{
public:
  X() {
    ;
  }
  ~X() {
    throw error();
  }
};

int main() {
  try {
    X * px = new X ;
    delete px;
  } catch (error) {
    assert(1) ;
  }
}

В этом примере delete оператор вызывает деструктор X::~X(). Деструктор выдает исключение, которое появляется как красная ошибка на теле деструктора и штрихуется красной на delete оператор. Исключение не распространяется на catch блок. Код, следующий за исключением, не проверяется. Это поведение требует, чтобы деструктор не выдавал исключение.

Черный assert оператор предполагает, что исключение не распространилось на catch блок.

#include<stdio.h>
#define SIZE 100

int arr[SIZE];
int getIndex();

int runningSum() {
  int index, sum=0;
  while(1) {
    index=getIndex();
    if(index < 0 || index >= SIZE)
      throw int(1);
    sum+=arr[index];
  }
}

void main() {
    printf("The sum of elements is: %d",runningSum());
}

В этом примере runningSum функция выдает исключение только в том случае, если index находится вне области значений [0,SIZE]. Как правило, ошибка, которая возникает из-за инструкций в if оператор оранжевый, а не красный. Ошибка оранжевого цвета, потому что альтернативный путь выполнения, который не включает if оператор не приводит к ошибке. Здесь, поскольку цикл бесконечен, нет альтернативного пути выполнения, который выходит за пределы цикла. Единственный способ выйти за пределы цикла - это исключение в if оператор. Поэтому ошибка Uncaught exception является красной.

#include <string>

void f() { throw; }        //rethrow not allowed - an error is raised here
void main() {
    try {
        throw std::string("hello");
     }
    catch (std::string& exc) {
        f();                    
    }
}

В этом примере исключение переиздается в функции f() вне catch блок. Перехват происходит при вызове throw сам по себе без аргумента исключения. Перехват обычно используется внутри catch блок для распространения исключения на внешний try- catch последовательность. Polyspace® Code Prover™ не поддерживает перекидывание вне catch и приводит к ошибке красного Uncaught exception.

Проверяйте информацию

Группа: C++
Язык: C++
Акроним: EXC