Specifiche di eccezione

Le specifiche di eccezione sono funzionalità del linguaggio C++ che è deprecata in C++0x.È stato progettato per fornire informazioni di riepilogo sulle eccezioni possono essere generate da una funzione, ma in pratica sono risultati importanti.La specifica di eccezione che è risultato essere piuttosto utile è la specifica throw ().Ad esempio:

void MyFunction(int i) throw();

indica al compilatore che la funzione non viene generata alcuna eccezione.Equivale a utilizzare __declspec (nothrow).Il suo utilizzo è considerato facoltativo.In C++0x, l'operatore noexcept introdotto, ma il supporto per questa funzionalità non è ancora presente in Visual C++ a partire da Visual Studio 2012.

Visual C++ parte dallo standard ANSI nell'implementazione delle specifiche di eccezione.Nella tabella seguente vengono riepilogati l'implementazione di Visual C++ le specifiche di eccezione:

Specifica di eccezione

Significato

generare ()

La funzione non genera un'eccezione.Tuttavia, se viene generata un'eccezione da un'istruzione throw contrassegnato funzione (), il compilatore di Visual C++ non chiamerà imprevisto (vedere unexpected (CRT) e unexpected (<exception>). per ulteriori informazioniSe una funzione contrassegnata con la generazione (), il compilatore di Visual C++ si presuppone che la funzione non genera eccezioni C++ e non genera il codice di conseguenza.Grazie alle ottimizzazioni di codice che potrebbero essere eseguite dal compilatore C++ (basato su presupposti che la funzione non genera alcune eccezioni C++) se una funzione genera un'eccezione, il programma non può eseguire correttamente.

generare (...)

La funzione può generare un'eccezione.

generare (type)

La funzione può generare un'eccezione di tipo type.Tuttavia, in Visual C++ .NET, questo viene interpretato come generare (...).Vedere identificatori di eccezione di funzione.

Se la gestione delle eccezioni utilizzata in un'applicazione, è necessario che una o più funzioni che gestisce le eccezioni generate.Tutte le funzioni chiamate tra tale che genera un'eccezione e che gestisce l'eccezione devono essere in grado di generare l'eccezione.

Il comportamento della generazione di una funzione dipende dai fattori seguenti:

  • Se si sta compilando la funzione in C o C++.

  • l'opzione del compilatore /EH utilizzate.

  • Se in modo esplicito specificare la specifica di eccezione.

Le specifiche esplicite di eccezione non sono consentite nelle funzioni c.

Nella tabella seguente viene riepilogato il comportamento della generazione di una funzione:

Funzione

/EHsc

/EHs

/EHa

/EHac

Funzione c

generare ()

generare (...)

generare (...)

generare (...)

Funzione C++ senza specificare eccezioni

generare (...)

generare (...)

generare (...)

generare (...)

Funzione C++ con specificare eccezioni throw ()

generare ()

generare ()

generare (...)

generare (...)

Funzione C++ con specificare eccezioni throw (...)

generare (...)

generare (...)

generare (...)

generare (...)

Funzione C++ con specificare eccezioni throw (type)

generare (...)

generare (...)

generare (...)

generare (...)

Esempio

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

Vedere anche

Riferimenti

provare, intercettare e generare istruzioni (C++)

Gestione delle eccezioni C++