Не могли бы вы объяснить, как именно должен использоваться on-error для “if”? С другой стороны, если для каждого оператора do требуется свой собственный “on-error” на случай ошибки в конкретной ветке “if”. Если же есть только одно общее выражение, ловящее “on-error”, тогда нужно как-то фиксировать, какая именно ветка вызвала ошибку… Давайте сразу представим конструкцию try/catch. Вся идея, и не только в MT-скриптах, конструкции “else-if” для меня неверна, когда между условиями нет никакой взаимосвязи. Чистый вариант: if условие then
набор операторов
else
другой набор операторов
endif — безусловно ведёт к выполнению одной или другой ветки. Если у вас несколько связанных или не связанных “if” и “else if”, то стоит использовать что-то вроде “switch” или “case of”:
case of
условие#1: набор операторов для условия#1
условие#2: набор операторов для условия#2
....
условие#N: набор операторов для условия#N
end case of
Это самообъясняющаяся конструкция, которая не зависит от “сохранённого” состояния предыдущих проверок, применяемых к последующим частям “else-if” в условии, которое надо “держать в голове”, анализируя код:
if условие#1 then
набор операторов для условия#1
else-if условие#2 then
набор операторов для условия#2
...
else-if условие#N then
набор операторов для условия#N
endif
на самом деле означает:
if условие#1 then
набор операторов для TRUE(условие#1)
else-if условие#2 then
набор операторов для условия#2, когда FALSE(условие#1) .and. TRUE(условие#2)
...
else-if условие#N then
набор операторов для условия#N, когда FALSE(условие#1) .and. FALSE(условие#2) .and. ... FALSE(условие#N-1) .and. TRUE(условие#N)
endif
по сравнению с более очевидным:
cond#1 = проверка#1
cond#2 = проверка#2
...
cond#N = проверка#N
case of
TRUE(условие#1) : операторы для условия#1
FALSE(условие#1) .and. TRUE(условие#2) : операторы для условия#2
...
FALSE(условие#1) .and. ... .and. TRUE(условие#N) : операторы для условия#N
end case of
Хотя, честно говоря, я сейчас, похоже, открыл ящик Пандоры.