Когда сигнализируется об ошибке, signal ищет активный
обработчик для этой ошибки. Обработчик — это последовательность выражений Lisp,
предназначенная для выполнения, если в части программы Lisp происходит ошибка. Если у ошибки
есть применимый обработчик, он выполняется, и управление возобновляется после обработчика.
Обработчик выполняется в окружении condition-case, который его установил;
все функции, вызванные внутри этого condition-case, уже завершились, и
обработчик не может вернуться к ним.
Если для ошибки нет применимого обработчика, она завершает текущую команду и возвращает
управление в цикл команд редактора. (Цикл команд имеет неявный обработчик для всех видов
ошибок.) Обработчик цикла команд использует символ ошибки и связанные с ним данные для
вывода сообщения об ошибке. Вы можете использовать переменную
command-error-function, чтобы контролировать, как это делается:
Эта переменная, если она не равна nil, указывает функцию, которую
необходимо использовать для обработки ошибок, возвращающих управление в цикл команд Emacs.
Функция должна принимать три аргумента: data, список того же вида, что
condition-case привязывает к своей переменной; context,
строку, описывающую ситуацию, в которой произошла ошибка, или (чаще всего) nil;
и caller, функцию Lisp, которая вызвала примитив, сигнализировавший об
ошибке.
Ошибка, для которой нет явного обработчика, может вызвать отладчик Lisp (см.
Вызов отладчика). Отладчик включен, если
переменная debug-on-error (см. Вход в отладчик при ошибке)
не равна nil. В отличие от обработчиков ошибок, отладчик выполняется в окружении
ошибки, поэтому вы можете изучить значения переменных именно в тот момент, когда произошла
ошибка. В пакетном режиме (см. Пактовый режим) процесс Emacs
затем обычно завершается с ненулевым кодом выхода.