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

Sergey ShishkinSergey Shishkin
1 min read

При возникновении ошибки при выполнении выполнение останавливается и запускается обработчик ошибок.

Обработчик ошибок сбрасывает каналы ввода-вывода на консоль и отображает местоположение (если возможно) и причину ошибки, за которыми следует сообщение об ошибке. Это сообщение также сохраняется в глобальном *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

https://picolisp.tiddlyhost.com/#Error%20Handling

0
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

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