Например:
if (true) try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
Другими словами, правильно ли положить try-блок сразу после условия if?
Например:
if (true) try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
Другими словами, правильно ли положить try-блок сразу после условия if?
Синтаксис блока try
(который является statement в С++)
try compound-statement handler-sequence
И синтаксисом if
является:
attr(optional) if ( condition ) statement_true
attr(optional) if ( condition ) statement_true else statement_false
где:
statement-true
- любое утверждение (часто составное утверждение), которое выполняется, если условие оценивается как truestatement-false
- любое (часто составной оператор), который выполняется, если условие оценивает значение false
Итак, ваш код является юридическим кодом в C++
.
statement_true
в вашем случае это блок try
.
В законности он похож на:
if (condition) for(...) {
...
}
Но ваш код не очень читабельен и может стать жертвой некоторых подводных камней С++ при добавлении else
. Таким образом, желательно добавить явный {...}
после if
в вашем случае.
Можно ли поставить блок try сразу после условия if?
Это законно, ваш код такой же, как (и лучше писать как):
if (true) {
try
{
// works as expected with both true and false, but is it legal?
}
catch (...)
{
// ...
}
}
Итак, если условие false
, то блок try-catch
не будет выполнен. Если это то, что вы ожидаете, это прекрасно.
Да. Скобки if
являются необязательными. Представьте, что у вас есть {}
вокруг try { .. } catch { .. }
.
Вам может быть интересно узнать, что это происходит, когда вы пишете if
/else if
/else
; На С++ фактически нет else if
& hellip; так что:
if (A) {
}
else if (B) {
}
фактически анализируется следующим образом:
if (A) {
}
else
if (B) {
}
что и есть:
if (A) {
}
else {
if (B) {
}
}
Он хорошо сформировался. try-blocks - это утверждения в соответствии с [stmt.stmt]/1, а операторы следуют if (…)
согласно [stmt.select]/1.