For example:
if (true) try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
In other words, is it legal to put the try-block right after the if condition?
For example:
if (true) try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
In other words, is it legal to put the try-block right after the if condition?
The syntax of a try
block (which is a statement in C++) is
try compound-statement handler-sequence
And the syntax of if
is:
attr(optional) if ( condition ) statement_true
attr(optional) if ( condition ) statement_true else statement_false
where:
statement-true
- any statement (often a compound statement), which is executed if condition evaluates to true
statement-false
- any statement (often a compound statement), which is executed if condition evaluates to false
So yes, your code is legal code in C++
.
statement_true
in your case is a try
block.
In legality, it is similar to:
if (condition) for(...) {
...
}
But your code is not very readable and can be the victim of some C++ pitfalls when an else
is added. So, it is advisable to add explicit {...}
after if
in your case.
is it legal to put the try-block right after the if condition?
It is legal. Your code is same as (and better to write as):
if (true) {
try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
}
So if the condition is false
then the try-catch
block won't be executed. If this is what you expect, it's fine.
Yes. The braces of an if
are optional. Imagine you have {}
around the try { .. } catch { .. }
.
It may interest you to know that this is what happens when you write if
/else if
/else
; C++ doesn't actually have else if
… so this:
if (A) {
}
else if (B) {
}
is actually parsed as this:
if (A) {
}
else
if (B) {
}
which is this:
if (A) {
}
else {
if (B) {
}
}
It's well-formed. try-blocks are statements as per [stmt.stmt]/1, and statements are following if (…)
as per [stmt.select]/1.