2012-04-07 8 views
2
#include "iostream" 
#include "conio.h" 
#include "exception" 
#include "cstdlib" 
using namespace std; 

void myunexpected() 
{ 
    cerr << "unexpected called\n"; 
    throw 0;  // throws int (in exception-specification) 
} 

void myfunction() throw (int) 
{ 
    throw 'x'; // throws char (not in exception-specification) 
} 

int main (void) 
{ 
    set_unexpected (myunexpected); 
    try 
    { 
     myfunction(); 
    } 
    catch (int) { cerr << "caught int\n"; } 
    catch (...) { cerr << "caught other exception (non-compliant compiler?)\n"; } 
    getch(); 
    return 0; 
} 

Ausgabe aufrufen (Wenn auf Visual Studio 2008 ausgeführt): andere Ausnahme gefangenException Handling - set_unexpected() nicht in der Lage

Aber ich erwartete (nicht konforme Compiler?) der Ausgang zu sein:

genannt unerwartete

gefangen int

HINWEIS: Ich habe dieses Programm auf Visual Studio 2008.

ausgeführt

Antwort

2

Ja, gemäß der Norm sollte die Ausgabe sein [# 1]:

unerwartet genannt
gefangen int

gcc gibt accurate result.

Beachten Sie, dass MSVC notorisch buggy w.r.t Umgang mit Ausnahmespezifikationen ist. Ausnahmespezifikationen gelten als failed experiment.

[# 1] 15.5.2 Die unexpected() Funktion [except.unexpected:
AFAIK, wird MSVC nicht Ausnahme Spezifikationen, mit Ausnahme der leeren (throw()/nothrow)

C++ 03 Standard-Implementierung]

Die unexpected() Funktion wird nicht zurückkehren, aber es kann (oder Re-Wurf) eine Ausnahme werfen. Wenn es eine neue Ausnahme auslöst, die durch die Ausnahmespezifikation erlaubt ist, die zuvor verletzt wurde, wird die Suche nach einem anderen Handler beim Aufruf der Funktion fortgesetzt, deren Ausnahmespezifikation verletzt wurde.

+1

Danke Man: -): D ;-) – Jatin