Try
Class Try (tryfunc)
Класс реализация блока try/catch/finally. В вызов try передается ссылка на функцию которую необходимо выполнить, далее передается до 10 аргументов функции через запятую.
Затем в методе catch первым аргументом указывается класс исключение - наследник Exception, или код ошибки, если будет перехватываться стандартная TrslError, вторым аргументов указывается ссылка на функцию, которую необходимо выполнить в случае перехвата ошибки. Блоков catch может быть указано сколько угодно много, однако выполнится функция лишь из первого подходящего блока. Если ни один блок не перехватит исключение, будет сгенерирована ошибка TrslError и программа завершится.
Далее есть возможность указать блок finally. Единственным аргументом этого метода является ссылка на функцию которую необходимо выполнить, независимо, было ли брошено исключение/ошибка или нет.
Также есть возможность обрабатывать стандартные ошибки TrslError. Тогда, если функция передаваемая в Try вызывает ошибку TrslError, в вызове catch первым параметром указывается код ошибки (0 или null если необходимо перехватить любую), вторым параметром так же остается ссылка на функцию. В debug режиме будет показана соответствующая ошибка, однако при выборе "Нет" на вопрос ("Будем отлаживать?") программа продолжит своё выполнение если ошибка была перехвачена.
Пример использования:
+

var resultSqr = null;
// Пример функции возведения Integer в квадрат
Macro mysqr(p)
if (ValType(p) != V_INTEGER)
return Throw(IllegalArgumentException("Не верный тип " + p));
end;
resultSqr = p * p;
if (resultSqr < 0) // В случае переполнения инта
RunError("Переполнение Integer");
end;
End;
Macro doOnIllegal(ex)
println("I'm on IllegalArgumentException");
End;
Macro doOnError(er)
println("I'm on error");
End;
Macro finallyBlock()
println("i'm in finnaly block.");
println("Result is " + resultSqr);
End;
Macro trySqr(parm)
try(@mysqr, parm) // Передаем фукнцию по ссылке и параметры
.catch(IllegalArgumentException, @doOnIllegal) // Если иключение того же типа или типа потомка, выполняется блок doOnIllegal
.catch(0, @doOnError) // Обработает любую ошибку
.finally(@finallyBlock); // В конце выполняем блок
End;
trySqr(25); // Исключений и ошибок не будет, выполнится лишь блок finally
trySqr("1"); // Не верный тип аргумента
trySqr(12000000); // Будет ошибка переполнения
Методы
macro catch (_exception, _doFunc)
Метод отлавливает ошибку _exception и выполняет функцию _doFunc или пропускает ошибку к следующему catch
macro execute ()
Запускает в ручную цепочку исполнения
macro finally (_finallyFunc)
Метод выполняет функцию _finallyFunc не зависимо было ли бброшено исключение или нет