Как смоделировать «попробуй наконец» или «попробуй», кроме языков, в которых их нет - PullRequest
8 голосов
/ 02 января 2012

Есть ли какой-либо способ имитировать try-finally или try-except на языке, который их не имеет?

Если есть какое-то случайное, непредсказуемое исключение, мне нужно быть уверенным, что какая-то очистка выполняется.

я мог бы попытаться убедиться, что не сгенерировано исключение, таким образом я уверен, что мой код очистки всегда выполняется - но тогда мне не понадобится try-finally/except.

Прямо в этот момент я пытаюсь создать try-finally в Lua; но я думаю, что любое решение будет работать и на других языках.

Хотя, на протяжении всей жизни, я не могу понять, как можно обработать исключение без сантехники, предоставляемой языковой инфраструктурой.

Но никогда не больно спрашивать.

Ответы [ 4 ]

15 голосов
/ 02 января 2012

У Lua уже есть необходимые механизмы, чтобы делать что-то, что не совсем в отличие от исключений.А именно pcall.

Вы можете использовать pcall для выполнения любой функции Lua.Если эта функция (или любая функция, которую она вызывает) вызывает error (assert вызывает error, если условие утверждения не выполняется), тогда управление потоком вернется на сайт оператора pcall.pcall вернет false и сообщение об ошибке (то, что передано error).

При этом вы можете «выбросить» ошибки и «перехватить» их.Ваша «попытка» - это просто pcall;ваш оператор "catch" проверяет результат pcall.

Также помните: Lua - это среда для сбора мусора.Вам не нужно делать какую-либо уборку.Или, если вы это сделаете, вам нужно изменить то, что требует модуль Lua.API Lua должны быть API Lua, а не API C или C ++.

2 голосов
/ 02 января 2012

Никогда не программируется в lua (это то, что вы пометили как). Однако на нескольких веб-страницах, включая этот http://jessewarden.com/2011/01/lua-for-actionscript-developers.html, упоминалось, что защищенный вызов (pcall) является устройством обработки ошибок lua.

Надеюсь, это поможет.

0 голосов
/ 02 января 2012

Как насчет Системы обработки исключений Lua ?Вы также можете использовать механизмы Lua RAII .

0 голосов
/ 02 января 2012

Как правило, исключения могут быть перехвачены с помощью функции signal ().Не уверен, что Луа поддержит такое.В C это то, что вы бы использовали.И это большое раздражение!(несколько сложно.)

...