Как Emacs обрабатывает ошибки
Когда программа на Lisp сигнализирует об ошибке, она вызывает функцию signal, которая ищет активный обработчик этой ошибки. Обработчик — это последовательность выражений Lisp, предназначенных для выполнения в случае возникновения ошибки в части программы на Lisp. Если для ошибки есть подходящий обработчик, он выполняется, после чего выполнение продолжается за ним. Обработчик выполняется в окружении condition-case, который его установил; все функции, вызванные внутри этого condition-case, уже завершили выполнение, и обработчик не может вернуться к ним.
Если для ошибки нет подходящего обработчика, она прерывает текущую команду, очищает все ожидающие необработанные события ввода (см. События ввода) и возвращает управление циклу команд редактора. (В цикле команд есть неявный обработчик для всех типов ошибок.) Затем обработчик цикла команд использует символ ошибки и связанные с ним данные, чтобы вывести сообщение об ошибке. Вы можете управлять этим с помощью переменной command-error-function:
- Переменная: command-error-function
Если эта переменная не равна
nil, она задаёт функцию для обработки ошибок, возвращающих управление циклу команд Emacs. Функция должна принимать три аргумента: data — список той же формы, что и тот, которыйcondition-caseсвязал бы со своей переменной; context — строка, описывающая ситуацию, в которой произошла ошибка, или (чаще)nil; и caller — функция Lisp, вызвавшая примитив, который сигнализировал об ошибке.
Ошибка, у которой нет явного обработчика, может вызвать отладчик Lisp (см. Вызов отладчика). Отладчик включён, если переменная debug-on-error (см. Вход в отладчик при ошибке) не равна nil. В отличие от обработчиков ошибок, отладчик выполняется в окружении ошибки, поэтому вы можете изучить значения переменных именно такими, какими они были в момент возникновения ошибки. В пакетном режиме (см. Пакетный режим) процесс Emacs обычно завершается с ненулевым кодом выхода.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Processing-of-Errors.html