IMO, sie sind hauptsächlich in Java und C # enthalten, weil sie bereits in C ++ existierten. Die eigentliche Frage ist also, warum C ++ so ist. Nach dem Entwurf und der Entwicklung von C ++ (§16.3):
Das trySchlüsselwort ist vollständig redundant, ebenso wie die { }Klammern, außer wenn mehrere Anweisungen tatsächlich in einem try-Block oder einem Handler verwendet werden. Zum Beispiel wäre es trivial gewesen, Folgendes zuzulassen:
int f()
{
return g() catch(xxii) { // not C++
error("G() goofed: xxii");
return 22;
};
}
Ich fand dies jedoch so schwierig zu erklären, dass die Redundanz eingeführt wurde, um Supportpersonal vor verwirrten Benutzern zu schützen.
Edit: Was den Grund für die Verwirrung angeht, muss man meiner Meinung nach nur die falschen Behauptungen in @Tom Jefferys Antwort (und insbesondere die Anzahl der erhaltenen Up-Votes) betrachten, um zu erkennen, dass es ein Problem geben würde. Für den Parser ist dies nicht anders als das Abgleichen von elses mit ifs - ohne geschweifte Klammern, um eine andere Gruppierung zu erzwingen, würden alle catch Klauseln mit den neuesten übereinstimmen throw. Für jene missverstandenen Sprachen, die es enthalten, finallywürden Klauseln dasselbe tun. Aus Sicht des Parsers unterscheidet sich dies kaum genug von der aktuellen Situation, um zu bemerken - insbesondere gibt es nach heutigem Stand der Grammatik nichts, um die catchKlauseln zu gruppieren - die Klammern gruppieren die Anweisungen, die von der gesteuert werdencatch Klauseln, nicht die catch-Klauseln selbst.
Aus der Sicht, einen Parser zu schreiben, ist der Unterschied fast zu gering, um es zu bemerken. Wenn wir mit so etwas beginnen:
simple_statement: /* won't try to cover all of this */
;
statement: compound_statement
| simple_statement
;
statements:
| statements statement
;
compound_statement: '{' statements '}'
catch_arg: '(' argument ')'
Dann wäre der Unterschied zwischen:
try_clause: 'try' statement
und:
try_clause: 'try' compound_statement
Ebenso für catch-Klauseln:
catch_clause: 'catch' catch_arg statement
gegen
catch_clause: 'catch' catch_arg compound_statement
Die Definition eines vollständigen Try / Catch-Blocks müsste sich jedoch nicht ändern. In jedem Fall wäre es so etwas wie:
catch_clauses:
| catch_clauses catch_clause
;
try_block: try_clause catch_clauses [finally_clause]
;
[Hier gebe ich [whatever]etwas Optionales an und lasse die Syntax für a aus, finally_clauseda ich glaube, dass sie keinen Einfluss auf die Frage hat.]
Auch wenn Sie dort nicht versuchen, alle Yacc-ähnlichen Grammatikdefinitionen zu befolgen, lässt sich der Punkt ziemlich einfach zusammenfassen: Diese letzte Anweisung (beginnend mit try_block) ist diejenige, bei der catchKlauseln mit tryKlauseln abgeglichen werden - und sie bleibt genau die gleich, ob die Klammern erforderlich sind oder nicht.
Um es zu wiederholen / Fassen wir zusammen: die Klammern Gruppe zusammen die gesteuerten Aussagen durch die catchs, aber nicht Gruppe der catchs selbst. Als solche haben diese Klammern absolut keinen Einfluss auf die Entscheidung , welche catchmit dem geht try. Für den Parser / Compiler ist die Aufgabe in beiden Fällen gleichermaßen einfach (oder schwierig). Trotzdem zeigt die Antwort von @ Tom (und die Anzahl der abgegebenen Stimmen), dass eine solche Änderung die Benutzer mit ziemlicher Sicherheit verwirren würde .
fordie Teile so etwas heißeninitial,conditionundstepdainitialmuss keine Variable definiert undstepkein Inkrement sein.