Обработка ошибок

При возникновении ошибки при выполнении выполнение останавливается и запускается обработчик ошибок.
Обработчик ошибок сбрасывает каналы ввода-вывода на консоль и отображает местоположение (если возможно) и причину ошибки, за которыми следует сообщение об ошибке. Это сообщение также сохраняется в глобальном *Msg, а местоположение ошибки — в ^. Если VAL глобального *Err не равен NIL, он выполняется как тело prg
. Если стандартный ввод поступает с терминала, запускается цикл read-eval-print (с вопросительным знаком "?" в качестве приглашения) (цикл завершается при вводе пустой строки). Затем выполняются все ожидающие выражения finally, восстанавливаются все привязки переменных и закрываются все файлы. Если стандартный ввод поступает не с терминала, интерпретатор завершает работу. В противном случае он сбрасывается в состояние верхнего уровня.
: (de foo (A B) (badFoo A B)) # 'foo' calls an undefined symbol
-> foo
: (foo 3 4) # Call 'foo'
!? (badFoo A B) # Error handler entered
badFoo -- Undefined
? A # Inspect 'A'
-> 3
? B # Inspect 'B'
-> 4
? # Empty line: Exit
Ошибки можно перехватывать с помощью catch, если для первого аргумента указан список подстрок возможных сообщений об ошибках. В таком случае возвращается соответствующая подстрока (или все сообщение об ошибке, если подстрока равна NIL).
Произвольную ошибку можно явно выдать с помощью quit.
Дополнительно см. пост err ... *Err
Subscribe to my newsletter
Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Sergey Shishkin
Sergey Shishkin
Всегда чему-то учусь!