11.7.3.1 Как сигнализировать об ошибке

Сигнализация об ошибке означает начало обработки ошибок. Обработка ошибок обычно прерывает всю или часть запущенной программы и возвращается к точке, настроенной для обработки ошибки (см. Обработка ошибок в Emacs). Здесь мы описываем, как сигнализировать об ошибке.

Большинство ошибок сигнализируются автоматически внутри примитивов Lisp, которые вы вызываете для других целей, например, если вы пытаетесь взять CAR целого числа или продвинуть символ в конце буфера. Вы также можете явно сигнализировать об ошибках с помощью функций error и signal.

Выход, который происходит, когда пользователь нажимает C-g, не считается ошибкой, но он обрабатывается почти как ошибка. См. Выход.

Каждая ошибка указывает сообщение об ошибке, как то или иное. Сообщение должно указывать на то, что не так («Файл не существует»), а не на то, как должны быть вещи («Файл должен существовать»). Общепринятая конвенция в Emacs Lisp состоит в том, что сообщения об ошибках должны начинаться с заглавной буквы, но не должны заканчиваться никакими знаками препинания.

Функция: error format-string &rest args

Эта функция сигнализирует об ошибке с сообщением об ошибке, созданным путем применения format-message (см. Форматирование строк) к format-string и args.

Эти примеры показывают типичное использование error:

(error "That is an error -- try something else")
     error→ That is an error -- try something else

(error "Invalid name `%s'" "A%%B")
     error→ Invalid name ‘A%%B’

error работает, вызывая signal с двумя аргументами: символом ошибки error и списком, содержащим строку, возвращенную format-message.

Обычно обратный апостроф и одинарная кавычка в формате преобразуются в соответствующие изогнутые кавычки, например, "Missing `%s'" может привести к "Missing ‘foo’". См. Стиль кавычек текста, как влиять или подавлять это преобразование.

Предупреждение: Если вы хотите использовать свою строку в качестве сообщения об ошибке дословно, не просто пишите (error string). Если string содержит «%», «`» или «'», она может быть переформатирована с нежелательными результатами. Вместо этого используйте (error "%s" string).

Когда noninteractive не равен nil (см. Режим пакетной обработки), эта функция завершает работу Emacs, если сигнализированная ошибка не имеет обработчика.

Функция: signal error-symbol data

Эта функция сигнализирует об ошибке, названной error-symbol. Аргумент data — это список дополнительных объектов Lisp, относящихся к обстоятельствам ошибки.

Аргумент error-symbol должен быть символом ошибки — символом, определенным с помощью define-error. Так Emacs Lisp классифицирует различные типы ошибок. См. Символы ошибок и имена условий для описания символов ошибок, условий ошибок и имен условий.

Если ошибка не обрабатывается, два аргумента используются при выводе сообщения об ошибке. Обычно это сообщение об ошибке предоставляется свойством error-message для error-symbol. Если data не равен nil, за ним следует двоеточие и список элементов data, разделенных запятыми. Для error сообщение об ошибке — это CAR data (это должна быть строка). Подкатегории file-error обрабатываются отдельно.

Количество и значение объектов в data зависят от error-symbol. Например, при ошибке wrong-type-argument в списке должно быть два объекта: предикат, описывающий ожидаемый тип, и объект, который не соответствовал этому типу.

И error-symbol, и data доступны всем обработчикам ошибок, обрабатывающим ошибку: condition-case привязывает локальную переменную к списку вида (error-symbol . data) (см. Написание кода для обработки ошибок).

Функция signal никогда не возвращает значение. Если ошибка error-symbol не имеет обработчика, и noninteractive не равен nil (см. Режим пакетной обработки), эта функция в конечном итоге завершает работу Emacs.

(signal 'wrong-number-of-arguments '(x y))
     error→ Wrong number of arguments: x, y

(signal 'no-such-error '("My unknown error condition"))
     error→ peculiar error: "My unknown error condition"
Функция: user-error format-string &rest args

Эта функция ведет себя точно так же, как error, за исключением того, что она использует символ ошибки user-error вместо error. Как следует из названия, это предназначено для сообщения об ошибках, вызванных пользователем, а не ошибках в самом коде. Например, если вы пытаетесь использовать команду Info-history-back (l) для перехода назад за начало истории просмотра Info, Emacs сигнализирует user-error. Такие ошибки не приводят к входу в отладчик, даже когда debug-on-error не равен nil. См. Вход в отладчик при ошибке.

Примечание Common Lisp: Emacs Lisp не имеет концепции непрерывных ошибок Common Lisp.