Поделиться через


Спецификации исключений

Спецификации исключений функция языка C++, в не рекомендуема C++0x.Они были разработаны для предоставления сводные данные о том, какие исключения может вызвать из функций только на практике они были найдено, чтобы быть проблемно.Одна спецификация исключения, доказала быть несколько полезна была спецификацией throw().Например:

void MyFunction(int i) throw();

сообщает компилятору, что функция не выдает никаких исключений.Эквивалентно использованию __declspec (nothrow).Его использование считается дополнительным.В C++0x, оператор noexcept вставлен, однако поддержка этой функции отсутствует в Visual C++ из Visual Studio 2012.

Visual C++ уходит из стандарта ANSI в своей реализации спецификаций исключения.Следующая таблица обобщает реализацию Visual C++ спецификаций исключения:

Спецификация исключений

Значение

throw()

Функция не вызывает исключение.Однако если исключение возникает в функции, помеченной с помощью throw(), компилятор Visual C++ не вызывает непредвиденной (дополнительные сведения см. разделе unexpected (CRT) и unexpected (<exception>)).Если функция помечается как throw(), компилятор Visual C++ предполагает, что функция не выдает исключения C++ и не генерирует код соответственно.Из-за оптимизациям кода, которые могут быть выполнены компилятором С++ (на основе предположении, что функция не выдает никаких исключений C++), если функция вызывает исключение, то программа не может выполняться правильно.

штрих (..).

Функция может вызвать исключение.

выполнение (type)

Функция может вызвать исключение типа type.Однако в Visual C++ .NET, это интерпретируется как выполняемый (...).См. раздел описатели исключения функции.

Если обработка исключений используется в приложении, должен иметь одну или несколько функций, которые обрабатывают исключения, вызванные методом.Все функции, вызываемые между двумя которое вызывает исключение и метод, который обрабатывает исключение, должны быть способны вызова исключения.

Реакция на событие хода функций зависит от следующих факторов:

  • Компилируете ли функция в C# или C++.

  • Используемый параметр компилятора /EH использовании.

  • Определить, является ли явно спецификация исключения.

Явные спецификации исключений не разрешены для функций на языке c.

В следующей таблице приведены расширения функциональности выполнения функции:

Функция

/EHsc

/EHs

/EHa

/EHac

Функция C

throw()

штрих (..).

штрих (..).

штрих (..).

Функция C++ без спецификации исключений

штрих (..).

штрих (..).

штрих (..).

штрих (..).

Функция C++ со спецификацией исключений throw()

throw()

throw()

штрих (..).

штрих (..).

Функция C++ со спецификацией исключений (..).

штрих (..).

штрих (..).

штрих (..).

штрих (..).

Функция C++ со спецификацией исключений (type)

штрих (..).

штрих (..).

штрих (..).

штрих (..).

Пример

// exception_specification.cpp
// compile with: /EHs
#include <stdio.h>

void handler() {
   printf_s("in handler\n");
}

void f1(void) throw(int) {
   printf_s("About to throw 1\n");
   if (1)
      throw 1;
}

void f5(void) throw() {
   try {
      f1();
   }
   catch(...) {
      handler();
    }
}

// invalid, doesn't handle the int exception thrown from f1()
// void f3(void) throw() {
//   f1();
// }

void __declspec(nothrow) f2(void) {
   try {
      f1();
   }
   catch(int) {
      handler();
    }
}

// only valid if compiled without /EHc 
// /EHc means assume extern "C" functions don't throw exceptions
extern "C" void f4(void);
void f4(void) {
   f1();
}

int main() {
   f2();

   try {
      f4();
   }
   catch(...) {
      printf_s("Caught exception from f4\n");
   }
   f5();
}
  

См. также

Ссылки

попробуйте, перехватывайте и вызывайте выписки (C++)

Обработка исключений С++