TRY FINALLY EXCEPT — различия между версиями
Alexey (обсуждение | вклад) |
Alexey (обсуждение | вклад) |
||
| Строка 14: | Строка 14: | ||
}}<br/>{{Аргумент | }}<br/>{{Аргумент | ||
|Название=блок FINALLY | |Название=блок FINALLY | ||
| − | |Пояснение=в блоке FINALLY находятся выражения, которые нужно выполнить независимо от того, возникло или нет исключение при выполнении блока TRY | + | |Пояснение=в блоке FINALLY находятся выражения, которые нужно выполнить независимо от того, возникло или нет исключение при выполнении блока TRY. Обычно используется для гарантированного освобождения ресурсов, выделенных в блоке TRY.<br>Фактически FINALLY не обрабатывает исключение, т.е. скрипт будет прерван, если нет никаких обработчиков EXCEPT. Чтобы всё-таки обработать исключение, нужно использовать вложенные конструкции TRY: |
| + | TRY( | ||
| + | TRY( | ||
| + | ..., | ||
| + | EXCEPT( | ||
| + | ... | ||
| + | ) | ||
| + | ), | ||
| + | FINALLY( | ||
| + | ... | ||
| + | ) | ||
| + | ) | ||
}}<br/>{{Аргумент | }}<br/>{{Аргумент | ||
|Название=блок EXCEPT | |Название=блок EXCEPT | ||
| Строка 57: | Строка 68: | ||
<br> | <br> | ||
Пример 3. | Пример 3. | ||
| − | + | '''TRY'''( | |
| − | '''TRY'''( | + | /*распределяем ресурсы*/ |
| + | :var.str:=TStringList.Create(), | ||
| + | /*попытка прочитать несуществующий файл*/ | ||
| + | :var.str.LoadFromFile(`C:\0.txt`), | ||
'''FINALLY'''( | '''FINALLY'''( | ||
| − | + | /*ВСЕГДА освобождаем ресурсы*/ | |
| − | + | :var.str.Free(), | |
| − | INFO(` | + | INFO(`Освободили ресурсы`) |
| + | ) | ||
| + | ), | ||
| + | INFO(`Продолжаем выполнение...`) | ||
| + | |||
| + | Будут выведены следующие сообщения: | ||
| + | * "Освободили ресурсы" | ||
| + | * "Не удалось открыть файл C:\0.txt" | ||
| + | и выполнение скрипта будет прервано. | ||
| + | |||
| + | <br> | ||
| + | Пример 3.1.<br>Аналогично предыдущему, но с обработкой исключения во вложенном блоке TRY..EXCEPT и, соответственно, продолжением выполнения скрипта. | ||
| + | '''TRY'''( | ||
| + | '''TRY'''( | ||
| + | /*распределяем ресурсы*/ | ||
| + | :var.str:=TStringList.Create(), | ||
| + | /*попытка прочитать несуществующий файл*/ | ||
| + | :var.str.LoadFromFile(`C:\000.txt`), | ||
| + | '''EXCEPT'''( | ||
| + | /*обрабатываем исключение*/ | ||
| + | INFO(`Не удалось прочитать файл`) | ||
) | ) | ||
| + | ), | ||
| + | '''FINALLY'''( | ||
| + | /*ВСЕГДА освобождаем ресурсы*/ | ||
| + | :var.str.Free(), | ||
| + | INFO(`Освободили ресурсы`) | ||
) | ) | ||
), | ), | ||
| Строка 69: | Строка 108: | ||
Будут выведены следующие сообщения: | Будут выведены следующие сообщения: | ||
| − | * " | + | * "Не удалось прочитать файл" |
| − | * " | + | * "Освободили ресурсы" |
| − | и выполнение скрипта будет | + | * "Продолжаем выполнение..." |
| + | и выполнение скрипта будет продолжено. | ||
<br> | <br> | ||
Версия 07:13, 14 июля 2017
Функции для обработки исключений (доступны с версии 1.9.0.9).
Синтаксис
TRY(выражение, выражение, ..., FINALLY(выражение, выражение, ...) )
или
TRY(выражение, выражение, ..., EXCEPT(выражение, выражение, ...) )
или
TRY(выражение, выражение, ..., EXCEPT(выражение, выражение, ..., RAISE() ) )
Аргументы
- блок TRY
- в блоке TRY находятся выражения, выполнение которых нужно проконтролировать
- блок FINALLY
- в блоке FINALLY находятся выражения, которые нужно выполнить независимо от того, возникло или нет исключение при выполнении блока TRY. Обычно используется для гарантированного освобождения ресурсов, выделенных в блоке TRY.
Фактически FINALLY не обрабатывает исключение, т.е. скрипт будет прерван, если нет никаких обработчиков EXCEPT. Чтобы всё-таки обработать исключение, нужно использовать вложенные конструкции TRY:
TRY(
TRY(
...,
EXCEPT(
...
)
),
FINALLY(
...
)
)
- блок EXCEPT
- в блоке EXCEPT находятся выражения, которые будут выполнены только в том случае, если в блоке TRY возникнет исключение. При этом исключение считается обработанным и выполнение скрипта не прерывается стандартным сообщением об ошибке
- RAISE()
- функция RAISE(), помещённая в блок EXCEPT, возобновляет исключение, проталкивая его во внешний обработчик или, если такового нет - в стандартный обработчик исключений
- Объект E
- E - объект для работы с ошибками. Например: E.ClassName(), E.Message()
Тип результата
- Нет
Примеры
Пример 1.
:SDt:=`aaa`,
TRY(STRTODATE(:SDt),
EXCEPT(
INFO(`Ошибка преобразования даты`)
)
),
INFO(`Продолжаем выполнение...`)
Будут выведены следующие сообщения:
- "Ошибка преобразования даты"
- "Продолжаем выполнение..."
и выполнение скрипта будет продолжено.
Пример 2.
:SDt:=`aaa`,
TRY(STRTODATE(:SDt),
EXCEPT(
INFO(`Ошибка преобразования даты`),
RAISE()
)
),
INFO(`Продолжаем выполнение...`)
Будут выведены следующие сообщения:
- "Ошибка преобразования даты"
- "'aaa' is not a valid date and time"
и выполнение скрипта будет прервано.
Пример 3.
TRY(
/*распределяем ресурсы*/
:var.str:=TStringList.Create(),
/*попытка прочитать несуществующий файл*/
:var.str.LoadFromFile(`C:\0.txt`),
FINALLY(
/*ВСЕГДА освобождаем ресурсы*/
:var.str.Free(),
INFO(`Освободили ресурсы`)
)
),
INFO(`Продолжаем выполнение...`)
Будут выведены следующие сообщения:
- "Освободили ресурсы"
- "Не удалось открыть файл C:\0.txt"
и выполнение скрипта будет прервано.
Пример 3.1.
Аналогично предыдущему, но с обработкой исключения во вложенном блоке TRY..EXCEPT и, соответственно, продолжением выполнения скрипта.
TRY(
TRY(
/*распределяем ресурсы*/
:var.str:=TStringList.Create(),
/*попытка прочитать несуществующий файл*/
:var.str.LoadFromFile(`C:\000.txt`),
EXCEPT(
/*обрабатываем исключение*/
INFO(`Не удалось прочитать файл`)
)
),
FINALLY(
/*ВСЕГДА освобождаем ресурсы*/
:var.str.Free(),
INFO(`Освободили ресурсы`)
)
),
INFO(`Продолжаем выполнение...`)
Будут выведены следующие сообщения:
- "Не удалось прочитать файл"
- "Освободили ресурсы"
- "Продолжаем выполнение..."
и выполнение скрипта будет продолжено.
Пример 4.
Можно использовать объект E для работы с ошибками:
:SDt:=`aaa`,
TRY(
STRTODATE(:SDt),
EXCEPT(
INFO(
`Произошла какая-то ошибка... Определим её тип.`
+ \
+ `Класс ошибки: `
+ E.ClassName()
+ \
+ `Текст ошибки: `
+ E.Message()
)
)
),
INFO(`Продолжаем выполнение...`)
Будут выведены следующие сообщения:
- Произошла какая-то ошибка... Определим её тип.
- Класс ошибки: EConvertError
- Текст ошибки: 'aaa' is not a valid date and time
- в выражении
- STRTODATE(:SDt)
- Продолжаем выполнение...