Dans différentes langues (au moins en Java, pensez aussi en C #?), Vous pouvez faire des choses comme
if( condition )
singleStatement;
while( condition )
singleStatement;
for( var; condition; increment )
singleStatement;
Ainsi, lorsque je n'ai qu'une déclaration, je n'ai pas besoin d'ajouter une nouvelle portée avec { }
. Pourquoi ne puis-je pas faire cela avec try-catch?
try
singleStatement;
catch(Exception e)
singleStatement;
Y at-il quelque chose de spécial dans try-catch qui nécessite de toujours avoir une nouvelle portée ou quelque chose? Et si oui, le compilateur ne pourrait-il pas résoudre ce problème?
for
les parties doit être nommé quelque chose commeinitial
,condition
etstep
commeinitial
nécessité de ne pas définir une variable etstep
ne doit pas être une augmentation.if
est toujours une instruction unique, et que plusieurs instructions entourées d'accolades constituent une seule instruction. Mais je suis un de ceux qui mettent toujours les accolades de toute façon, alors ...throw
etreturn
, et comme @detly, si vous considérez les accolades comme un seul groupe d'énoncés, je ne le trouve pas. incohérent non plus. Je n'ai jamais compris ce que sont ces "nombreuses erreurs de codage" mentionnées par les gens. Les gens doivent commencer à faire attention à ce qu'ils font, à bien utiliser l'indentation et à passer des tests unitaires: P n'a jamais eu de problème avec ça ...Réponses:
Messieurs, ils sont inclus dans Java et C # principalement parce qu’ils existaient déjà en C ++. La vraie question est donc de savoir pourquoi C ++ est ainsi. Selon la conception et l'évolution de C ++ (§16.3):
Edit: Quant à savoir pourquoi cela serait source de confusion, je pense qu'il suffit de regarder les affirmations incorrectes contenues dans la réponse de Tom Tom Jeffery (et, en particulier, le nombre de votes positifs qu'il a reçus) pour se rendre compte qu'il y aurait un problème. Pour l'analyseur, cela ne diffère vraiment pas de l'appariement de
else
s avec desif
accolades s manquantes pour forcer un autre groupe, toutes lescatch
clauses correspondraient aux plus récentesthrow
. Les clauses qui en font partie comprennent lesfinally
clauses mal faites. Du point de vue de l'analyseur, ceci est à peine assez différent de la situation actuelle pour s'en rendre compte - en particulier, à l'heure actuelle, les grammaires ne permettent pas de regrouper lescatch
clauses - les crochets regroupent les instructions contrôlées par lecatch
clauses, pas les clauses de capture eux-mêmes.Du point de vue de l'écriture d'un analyseur syntaxique, la différence est presque trop minime pour être remarquée. Si nous commençons avec quelque chose comme ceci:
Alors la différence serait entre:
et:
De même, pour les clauses de capture:
contre.
Cependant, la définition d'un bloc try / catch complet n'aurait pas besoin de changer du tout. De toute façon, ce serait quelque chose comme:
[Ici, j'utilise
[whatever]
pour indiquer quelque chose d’optionnel, et je laisse de côté la syntaxe pour unfinally_clause
puisque je ne pense pas que cela ait une incidence sur la question.]Même si vous n'essayez pas de suivre toute la définition de la grammaire, à la manière de Yacc, le point peut être résumé assez facilement: cette dernière instruction (commençant par
try_block
) est celle où lescatch
clauses sont mises en correspondance avec destry
clauses - et cela reste exactement la même chose. même si les accolades sont nécessaires ou non.Pour répéter / résumer: les accolades regroupent les instructions contrôlées par le
catch
s, mais ne les regroupent pascatch
elles-mêmes. En tant que tels, ces accolades n’ont absolument aucun effet sur le choix ducatch
choixtry
. Pour l'analyseur / compilateur, la tâche est également facile (ou difficile) dans les deux cas. Malgré cela, la réponse @ Tom (et le nombre de votes up-il a reçu) fournit la démonstration suffisante du fait que le changement d' un tel feriez utilisateurs presque certainement embrouiller.la source
try return g(); catch(xxii) error("G() goofed: xxii");
ce qui aurait été soigné encore IMODans une réponse à la question de savoir pourquoi les crochets sont obligatoires pour certaines constructions à déclaration unique et non pour d'autres , Eric Lippert a écrit:
En d’autres termes, son implémentation coûtait plus cher à l’équipe de compilation que ce qui était justifié, pour le bénéfice marginal qu’elle apporterait.
la source
Je pense que c'est pour éviter les problèmes de style. Ce qui suit serait ambigu ...
Cela pourrait signifier ceci:
Ou...
la source
if
affaire. Il est facile de simplement dire "bien le reste se lie au plus profond si" et en finir avec cela. Mais pour essayer / attraper cela ne fonctionne pas.Je pense que la raison principale est qu’il n’ya que très peu de choses que vous puissiez faire en C # qui aurait besoin d’un bloc try / catch qui n’est qu’une ligne. (Je n'arrive pas à penser au meilleur de ma tête en ce moment). Vous pouvez avoir un argument valable en termes de bloc catch, par exemple une instruction d'une ligne pour enregistrer quelque chose, mais en termes de lisibilité, il est plus logique (du moins pour moi) d'exiger {}.
la source