---
description: "Learn more about: Exception specifications (throw, noexcept) (C++)"
title: "Exception specifications (throw, noexcept) (C++)"
ms.date: "01/18/2018"
helpviewer_keywords: ["exceptions [C++], exception specifications", "throwing exceptions [C++], throw keyword", "C++ exception handling [C++], throwing exceptions", "throw keyword [C++]", "noexcept keyword [C++]"]
ms.assetid: 4d3276df-6f31-4c7f-8cab-b9d2d003a629
---
# Exception specifications (throw, noexcept) (C++)
Exception specifications are a C++ language feature that indicate the programmer's intent about the exception types that can be propagated by a function. You can specify that a function may or may not exit by an exception by using an *exception specification*. The compiler can use this information to optimize calls to the function, and to terminate the program if an unexpected exception escapes the function.
Prior to C++17 there were two kinds of exception specification. The *noexcept specification* was new in C++11. It specifies whether the set of potential exceptions that can escape the function is empty. The *dynamic exception specification*, or `throw(optional_type_list)` specification, was deprecated in C++11 and removed in C++17, except for `throw()`, which is an alias for `noexcept(true)`. This exception specification was designed to provide summary information about what exceptions can be thrown out of a function, but in practice it was found to be problematic. The one dynamic exception specification that did prove to be somewhat useful was the unconditional `throw()` specification. For example, the function declaration:
```cpp
void MyFunction(int i) throw();
```
tells the compiler that the function does not throw any exceptions. However, in [`/std:c++14`](../build/reference/std-specify-language-standard-version.md) mode this could lead to undefined behavior if the function does throw an exception. Therefore we recommend using the [`noexcept`](../cpp/noexcept-cpp.md) operator instead of the one above:
```cpp
void MyFunction(int i) noexcept;
```
The following table summarizes the Microsoft C++ implementation of exception specifications:
|Exception specification|Meaning|
|-----------------------------|-------------|
|**`noexcept`**
`noexcept(true)`
`throw()`|The function does not throw an exception. In **`/std:c++14`** mode (which is the default), **`noexcept`** and `noexcept(true)` are equivalent. When an exception is thrown from a function that is declared **`noexcept`** or `noexcept(true)`, [`std::terminate`](../standard-library/exception-functions.md#terminate) is invoked. When an exception is thrown from a function declared as `throw()` in **`/std:c++14`** mode, the result is undefined behavior. No specific function is invoked. This is a divergence from the C++14 standard, which required the compiler to invoke [`std::unexpected`](../standard-library/exception-functions.md#unexpected).
**Visual Studio 2017 version 15.5 and later**: In **`/std:c++17`** mode , **`noexcept`**, `noexcept(true)`, and `throw()` are all equivalent. In **`/std:c++17`** mode, `throw()` is an alias for `noexcept(true)`. In **`/std:c++17`** mode and later, when an exception is thrown from a function declared with any of these specifications, [`std::terminate`](../standard-library/exception-functions.md#terminate) is invoked as required by the C++17 standard.|
|`noexcept(false)`
`throw(...)`
No specification|The function can throw an exception of any type.|
|`throw(type)`| (**C++14 and earlier**) The function can throw an exception of type `type`. The compiler accepts the syntax, but interprets it as `noexcept(false)`. In **`/std:c++17`** mode and later, the compiler issues warning C5040.|
If exception handling is used in an application, there must be a function in the call stack that handles thrown exceptions before they exit the outer scope of a function marked **`noexcept`**, `noexcept(true)`, or `throw()`. If any functions called between the one that throws an exception and the one that handles the exception are specified as **`noexcept`**, `noexcept(true)` (or `throw()` in **`/std:c++17`** mode), the program is terminated when the noexcept function propagates the exception.
The exception behavior of a function depends on the following factors:
- Which [language standard compilation mode](../build/reference/std-specify-language-standard-version.md) is set.
- Whether you are compiling the function under C or C++.
- Which [`/EH`](../build/reference/eh-exception-handling-model.md) compiler option you use.
- Whether you explicitly specify the exception specification.
Explicit exception specifications are not allowed on C functions. A C function is assumed not to throw exceptions under **`/EHsc`**, and may throw structured exceptions under **`/EHs`**, **`/EHa`**, or **`/EHac`**.
The following table summarizes whether a C++ function may potentially throw under various compiler exception handling options:
|Function|`/EHsc`|`/EHs`|`/EHa`|`/EHac`|
|--------------|------------|-----------|-----------|------------|
|C++ function with no exception specification|Yes|Yes|Yes|Yes|
|C++ function with **`noexcept`**, `noexcept(true)`, or `throw()` exception specification|No|No|Yes|Yes|
|C++ function with `noexcept(false)`, `throw(...)`, or `throw(type)` exception specification|Yes|Yes|Yes|Yes|
## Example
```cpp
// exception_specification.cpp
// compile with: /EHs
#include
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();
}
```
```Output
About to throw 1
in handler
About to throw 1
Caught exception from f4
About to throw 1
in handler
```
## See also
[`try`, `throw`, and `catch` Statements (C++)](../cpp/try-throw-and-catch-statements-cpp.md)\
[Modern C++ best practices for exceptions and error handling](errors-and-exception-handling-modern-cpp.md)