2017-01-30 4 views
-2

Dieses Programm gibt nicht die Ausgabe, die ich erwarte es zu geben.Wie funktioniert das erneute Programmieren, wenn mehrere Programme vorhanden sind?

Nach meinem Verständnis von erneut in C++, sollte es den nächsten catch-Block des Programms ausführen, aber es führt nicht den catch-Block und stattdessen wird das nächste Programm ausgeführt. Was macht das Retrowing eigentlich?

Die Ausgabe, die es gibt, ist "intcaught", aber ich erwartete, dass es "intcaughtcaught" ausgibt. Was ist los mit meiner Argumentation?

#include <iostream> 

using namespace std; 

template <class t> 
void sign(t a) { 
    try { 
     throw a; 
    } catch (int i) { 
     cout << "int"; 
     throw; 
    } 
} 

main() { 
    try { 
     sign<int>(1); 
     sign<int>('1'); 
    } catch (...) { 
     cout << "caught"; 
    } 
} 
+1

Versuchen Sie mit Debugger, es ist wirklich gut im Umgang mit dieser Art von Problemen – alexeykuzmin0

+0

Ich habe versucht, Ihre Sprache einige zu klären, aber ich bin mir nicht sicher, was Sie mit "Programm" gemeint, so dass ich nicht in der Lage, es vollständig zu klären. Könnten Sie bitte erklären, was Sie mit "Programm" meinen? – jaggedSpire

+0

_ "Stattdessen wird das nächste Programm ausgeführt" _ Welches nächste Programm? –

Antwort

2
try { 
    sign<int>(1); 
    sign<int>('1'); 
} catch (...) { 
    cout << "caught"; 
} 

Der erste Anruf sign [Re-] gibt eine Ausnahme aus, so springt die Ausführung des "caught" Text zu drucken.

Das ist es.

Die Ausführung springt nicht erneut in den Block try zurück. Also, Ihr zweiter sign Anruf passiert nie.

try { 
    sign<int>(1); 
} catch (...) { 
    cout << "caught"; 
} 

try { 
    sign<char>('1'); 
} catch (...) { 
    cout << "caught"; 
} 

Beachten Sie, wie ich mich verändert habe auch die in dem zweiten Aufruf Template-Parameter, sonst wird Ihre "int" Ausgabe wieder auftauchen wird:

Ihre Erwartung würde durch den Code der folgenden Form erfüllt werden.

1

sign<int>('1'); wird nie erreicht. (Wenn dies der Fall wäre, würde das char Literal '1' in ein int entsprechend dem Zeichen umgewandelt werden, das auf Ihrer Plattform codiert).

Dies, da die throw; nach cout<<"int";i (technisch durch Bezugnahme eingeschlossen) auslöst, und dass durch die Rast Handler in main gefangen wird.

Verwandte Themen