TRY FINALLY EXCEPT — различия между версиями

Материал из GB wiki
Перейти к: навигация, поиск
Строка 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.
:SDt:=`aaa`,
+
  '''TRY'''(
  '''TRY'''(STRTODATE(:SDt),
+
  /*распределяем ресурсы*/
 +
  :var.str:=TStringList.Create(),
 +
  /*попытка прочитать несуществующий файл*/
 +
  :var.str.LoadFromFile(`C:\0.txt`),
 
   '''FINALLY'''(
 
   '''FINALLY'''(
     IIF(
+
     /*ВСЕГДА освобождаем ресурсы*/
      STRLEN(:SDt)<>10,
+
    :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:
  
 
Будут выведены следующие сообщения:
 
Будут выведены следующие сообщения:
* "Некорректная строка с датой"
+
* "Не удалось прочитать файл"
* "'aaa' is not a valid date and time"
+
* "Освободили ресурсы"
и выполнение скрипта будет прервано.
+
* "Продолжаем выполнение..."
 +
и выполнение скрипта будет продолжено.
  
 
<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)
  • Продолжаем выполнение...