Try

Class Try (tryfunc)

Класс реализация блока try/catch/finally. В вызов try передается ссылка на функцию которую необходимо выполнить, далее передается до 10 аргументов функции через запятую.

Затем в методе catch первым аргументом указывается класс исключение - наследник Exception, или код ошибки, если будет перехватываться стандартная TrslError, вторым аргументов указывается ссылка на функцию, которую необходимо выполнить в случае перехвата ошибки. Блоков catch может быть указано сколько угодно много, однако выполнится функция лишь из первого подходящего блока. Если ни один блок не перехватит исключение, будет сгенерирована ошибка TrslError и программа завершится.

Далее есть возможность указать блок finally. Единственным аргументом этого метода является ссылка на функцию которую необходимо выполнить, независимо, было ли брошено исключение/ошибка или нет.

Также есть возможность обрабатывать стандартные ошибки TrslError. Тогда, если функция передаваемая в Try вызывает ошибку TrslError, в вызове catch первым параметром указывается код ошибки (0 или null если необходимо перехватить любую), вторым параметром так же остается ссылка на функцию. В debug режиме будет показана соответствующая ошибка, однако при выборе "Нет" на вопрос ("Будем отлаживать?") программа продолжит своё выполнение если ошибка была перехвачена.

Пример использования:

+

copy sample
    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);      // Будет ошибка переполнения
import "..\\mac\\extra\\OOP\\Exceptions.mac";
    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 не зависимо было ли бброшено исключение или нет