Specyfikacje wyjątek
Wyjątek specyfikacje są funkcja języka C++ jest przestarzałe w C ++ 0 x.Zostały one zaprojektowane sumaryczne informacje o wyjątków, jakie może zostać wygenerowany z funkcji, ale w praktyce były znaleziony problematyczny.Specyfikacja wyjątek okażą się przydatne nieco był specyfikacji throw().Na przykład:
void MyFunction(int i) throw();
informuje kompilator, funkcja generują wyjątki.Jest to równoważne użyciu __declspec(nothrow).Jego stosowanie jest traktowane opcjonalnie.W C ++ 0 x noexcept jest wprowadzony operator, ale obsługa ta funkcja nie jest jeszcze obecny w Visual C++ od Visual Studio 2012.
Visual C++ odbiega od Standard ANSI w realizacji specyfikacje wyjątek.Poniższa tabela zawiera podsumowanie wykonania Visual C++ specyfikacje wyjątek:
Specyfikacja wyjątek |
Znaczenie |
---|---|
throw() |
Funkcja nie Zgłoś wyjątek.Jednak jeśli wyjątek jest z funkcją oznaczone throw(), kompilator Visual C++ będzie nie wywołać nieoczekiwane (zobacz unexpected (CRT) i unexpected (<exception>) więcej informacji).Jeśli funkcja jest oznaczone throw(), kompilatora Visual C++ przyjmie funkcji nie generują wyjątki C++ i odpowiednio generowanie kodu.Ze względu na optymalizację kodu, które mogą być wykonywane przez kompilator C++ (oparte na założeniu, że funkcja generują wyjątki C++), jeśli funkcja Zgłoś wyjątek, program nie może poprawnie wykonać. |
throw(...) |
Funkcja może zgłosić wyjątek. |
throw(type) |
Funkcja może zgłosić wyjątek typu type.Jednak w Visual C++ .net, to jest interpretowana jako throw(...).Zobacz Specyfikatory wyjątek w funkcji. |
Jeśli obsługa wyjątków jest używany w aplikacji, musi być jedną lub więcej funkcji, które obsługują thrown wyjątki.Wszelkie funkcje nazywane między jedną, która zgłasza wyjątek i który obsługuje wyjątek musi umożliwiać rzuca wyjątek.
Rzut zachowanie funkcji zależy od następujących czynników:
Czy są kompilacja funkcji c lub C++.
Które /EH za pomocą opcji kompilatora.
Czy jawnie określić specyfikacji wyjątek.
Specyfikacje jawne wyjątku nie są dozwolone na funkcje C.
Poniższa tabela podsumowuje zachowanie throw funkcji:
Funkcja |
/ EHsc |
/ EHs. |
/ EHa |
/ EHac |
---|---|---|---|---|
Funkcja c |
throw() |
throw(...) |
throw(...) |
throw(...) |
Brak specyfikacji wyjątek C++ funkcji |
throw(...) |
throw(...) |
throw(...) |
throw(...) |
Funkcja C++ ze specyfikacją wyjątek throw() |
throw() |
throw() |
throw(...) |
throw(...) |
Funkcja C++ ze specyfikacją wyjątek throw(...) |
throw(...) |
throw(...) |
throw(...) |
throw(...) |
Funkcja C++ z throw (type) specyfikacji wyjątek |
throw(...) |
throw(...) |
throw(...) |
throw(...) |
Przykład
// 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();
}