Udostępnij za pośrednictwem


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();
}
  

Zobacz też

Informacje

Spróbuj połowu i throw sprawozdań (C++)

Obsługa wyjątków C++