Uncaught exception

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

Описание

Эта проверка ищет следующие проблемы:

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

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

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

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

  • 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 выдает исключение. Это исключение распространяет непойманный к 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