Par exemple:
if (true) try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
En d'autres termes, est-il légal de mettre le try-block juste après la condition if?
La syntaxe d'un bloc try
(qui est un instruction en C++) est
try compound-statement handler-sequence
Et la syntaxe de if
est:
attr(optional) if ( condition ) statement_true
attr(optional) if ( condition ) statement_true else statement_false
où:
statement-true
- toute instruction (souvent une instruction composée), qui est exécutée si la condition est évaluée à truestatement-false
- toute instruction (souvent une instruction composée), qui est exécutée si la condition est fausse
Alors oui, votre code est un code légal dans C++
.
statement_true
dans votre cas est un bloc try
.
En termes de légalité, il est similaire à:
if (condition) for(...) {
...
}
Mais votre code n'est pas très lisible et peut être victime de certains pièges C++ lorsqu'un else
est ajouté. Il est donc conseillé d'ajouter explicitement {...}
après if
dans votre cas.
est-il légal de placer le bloc d'essai juste après la condition if?
C'est légal. Votre code est identique à (et mieux à écrire comme):
if (true) {
try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
}
Donc, si la condition est false
alors la try-catch
le bloc ne sera pas exécuté. Si c'est ce que vous attendez, ça va.
Oui. Les accolades d'un if
sont facultatives. Imaginez que vous avez {}
autour du try { .. } catch { .. }
.
Il peut vous intéresser de savoir que c'est ce qui se passe lorsque vous écrivez if
/else if
/else
; C++ n'a pas réellement else if
… donc ça:
if (A) {
}
else if (B) {
}
est en fait analysé comme ceci:
if (A) {
}
else
if (B) {
}
c'est ça:
if (A) {
}
else {
if (B) {
}
}
C'est bien formé. try-block s sont instruction s selon [ stmt.stmt]/1 et les instructions s suivent if (…)
selon [stmt.select ]/1 .