Sdílet prostřednictvím


Specifikace výjimek

Specifikace výjimek jsou funkce jazyka C++, které jsou zastaralé v C++11.Byly navrženy, aby poskytovaly souhrnné informace o tom, jaké výjimky mohou být vyvolány ve funkci, ale v praxi se jevily jako problematické.Specifikace jediné výjimky, která se ukázala být užitečná, byla specifikace throw().Příklad:

void MyFunction(int i) throw();

instruuje kompilátor, aby funkci nevyvolávala žádné výjimky.Je ekvivalentní k použití __declspec(nothrow).Jeho použití se považuje za nepovinné.Ve standardu ISO C++11 je zaveden operátor noexcept, ale podpora pro tuto funkci není dosud k dispozici v aplikaci Visual C++.

Visual C++ se liší od standardu ISO C++ ve své implementaci specifikací výjimek. Následující tabulka shrnuje implementaci specifikace výjimek Visual C++:

Specifikace výjimek

Význam

throw()

Funkce nevyvolá výjimku.Pokud však je výjimka vyvolána z funkce označené throw(), kompilátor Visual C++ nebude volat unexpected (viz neočekávané (CRT) a unexpected (<exception>) pro další informace).Pokud funkce je označena throw(), kompilátor Visual C++ bude předpokládat, že funkce nevyvolá výjimky C++ a generuje kód odpovídajícím způsobem.Z důvodu optimalizace kódu, které může provádět kompilátor C++ (založeno na předpokladu, že funkce nevyvolá žádné výjimky C++), pokud funkce vyvolá výjimku, nemusí program být správně spuštěn.

throw(...)

Funkce může vyvolat výjimku.

throw(type)

Funkce může vyvolat výjimku typu type.V aplikaci Visual C++ .NET, to je však interpretováno jako throw(...). Viz specifikátory výjimek funkcí.

Pokud je v aplikaci použito zpracování výjimek, musí být vyvolána jedna či více funkcí, které zpracovávají výjimky.Všechny volané funkce mezi tou, která vyvolá výjimku a tou, která zpracovává výjimku, musí být schopny vyvolat výjimku.

Chování vyvolání výjimky funkce závisí na následujících faktorech:

  • Když jste kompilovali funkci pod C nebo C++.

  • Kterou možnost kompilátoru /EH použijete.

  • Zda explicitně zadáte specifikaci výjimky.

Explicitní specifikace výjimek nejsou povoleny ve funkcích C.

Následující tabulka shrnuje chování vyvolání výjimky funkce:

Funkce

/EHsc

/EHs

/EHa

/EHac

Funkce C

throw()

throw(...)

throw(...)

throw(...)

C++ funguje bez specifikací výjimek

throw(...)

throw(...)

throw(...)

throw(...)

C++ funguje se specifikací výjimky throw()

throw()

throw()

throw(...)

throw(...)

C++ funguje se specifikací výjimky throw(...)

throw(...)

throw(...)

throw(...)

throw(...)

C++ funguje se specifikací výjimky throw(type)

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

try, throw a catch – příkazy (C++)

Zpracovávání výjimek v jazyce C++