Sdílet prostřednictvím


Specifikace výjimky

Specifikace výjimky jsou funkce jazyka C++ neschválený C ++ 0 x.Souhrnné informace o jaké výjimky může být vyvolána z funkce byly navrženy, ale v praxi byly shledány jako problematické.Specifikace jednu výjimku, která ukázat jako užitečné poněkud byla specifikace throw().Příklad:

void MyFunction(int i) throw();

kompilátoru sděluje, že funkce není vyvoláním výjimky.Je ekvivalentní použití __declspec(nothrow).Jeho použití považovány za volitelné.C ++ 0 x noexcept operátor je zaveden, ale tato funkce ještě není v aplikaci Visual C++, Visual Studio 2012 k podpora.

Visual C++ vyplouvající z Standard ANSI při jeho provádění specifikace výjimku.Následující tabulka shrnuje provádění výjimek specifikace Visual C++:

Specifikace výjimky

Význam

throw()

Funkce není vyvoláním výjimky.Však z funkce označeny throw() je vyvolána výjimka, kompilátor Visual C++ nebude kontaktujte (viz unexpected (CRT) a unexpected (<exception>) Další informace).Pokud funkce je označeno throw(), kompilátoru Visual C++ bude předpokládat, že funkce neobsahuje vyvolávají výjimky C++ a odpovídajícím způsobem generování kódu.Z důvodu optimalizace kódu, které může provádět kompilátor C++ (založeno na předpokladu, že funkce není vyvoláním výjimky C++) Pokud funkce vyvoláním výjimky, nemusí program správně spustit.

throw(...)

Funkce může vyvolat výjimku.

throw(type)

Funkce může vyvolat výjimku typu type.V jazyce Visual C++. to však interpretován jako throw(...).Viz specifikátory výjimka funkce.

Pokud je v aplikaci zpracování výjimek, musí být jednu nebo více funkcí, které zpracovávají thrown výjimky.Všechny funkce nazývá mezi, který vyvolá výjimku a který zpracovává výjimky musí být schopné vyvolání výjimky.

Throw chování funkce závisí na následujících faktorech:

  • Zda jsou kompilace funkce v c nebo C++.

  • Které /EH použijete volbu kompilátoru.

  • Zda je explicitně určit specifikace výjimku.

C funkcí nejsou povoleny výjimky explicitní specifikace.

Následující tabulka shrnuje chování throw funkce:

Function

/ EHsc

/ EHs

/ EHa

/ EHac

Funkce c

throw()

throw(...)

throw(...)

throw(...)

Funkce jazyka C++ s žádné určení výjimek

throw(...)

throw(...)

throw(...)

throw(...)

Funkce jazyka C++ s výjimkou specifikací throw()

throw()

throw()

throw(...)

throw(...)

Funkce jazyka C++ s výjimkou specifikací throw(...)

throw(...)

throw(...)

throw(...)

throw(...)

Funkce jazyka C++ s umístěním projekce (type) specifikaci výjimky

throw(...)

throw(...)

throw(...)

throw(...)

Příklad

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

Viz také

Referenční dokumentace

Zkuste, úlovku a vyvoláním prohlášení (C++)

Zpracování výjimek v C++