Как сигнализировать об ошибке
Сигнализировать об ошибке означает начать обработку ошибки. Обычно обработка ошибки прерывает выполнение всей программы или её части и возвращает управление в точку, подготовленную для обработки ошибки (см. Как 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 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.
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/Signaling-Errors.html