Спецификации исключений
Спецификации исключений функция языка 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();
}