Spec-Zone.ru › Elisp

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

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API