Обработка исключений
Пока не реализовано в интерпретаторе.
Механизм исключений позволяет, чтобы исключение могло быть брошено в одной функции, а поймано в другой функции (или в блоке `plain), где происходит вызов первой функции. Или может быть сложная цепочка вызовов. Непойманное исключение в ksi является ошибкой и прекращает работу программы.
Специальный тип данных
Исключения хранятся в объекте класса $exception, который имеет следующий вид:
Если статическое поле need_trace равно true #1, то поле trace будет заполнено массивом при бросании исключения. А иначе trace будет null #. Значение по-умолчанию статического поля need_trace равно false #0.
Как бросать исключения
Чтобы бросить исключение используется оператор `throw, котоый формирует объект класса $exception.
Выражение слева от `throw – это бросаемое значение, а справа – текст сообщения. Бросаемое значение попадает в поле value, а сообщение – в поле msg.
Обычно сообщение (поле msg) имеет тип $text, однако в ksi нет жёстких ограничений, и это может быть любое значение (например null #).
Как ловить исключения
Для ловли исключений используется конструкция `try.
`try e ~ означает, что если исключение брошено и найден соответствующий блок catch, то переменная e в качестве значения примет объект типа $exception, заполненный при вызове оператора `throw.
Перегрузка блоков catch работает по принципу перегрузки функций. И статическая перегрузка тоже допустима.
Чтобы назначить блок catch для любых бросаемых значений – тип не указывается.
Конструкция `try может содержать несколько блоков catch. Кроме того один блок catch может быть перегружен для разных типов бросаемого значения.
Рассмотрим пример, где исключение может быть брошено из функции &at, а поймано в блоке `plain.
Возможный результат работы:
Блоки `try могут быть вложены и исключение, непойманное во внутреннем блоке будет передано внешнему блоку `try. Кроме того исключение может быть брошено из блока catch.
Блок try как часть большего выражения
Блок `try возвращает значение типа $bool в зависимости от того было ли исключение брошено и поймано. Если да, то блок `try вернёт true #1, иначе false #0.