11.7.3.2 Как Emacs обрабатывает ошибки

Когда сигнализируется об ошибке, 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 затем обычно завершается с ненулевым кодом выхода.