Spec-Zone.ru › Elisp

Символы ошибок и имена условий

При подаче сигнала об ошибке указывается символ ошибки, определяющий тип ошибки. Каждая ошибка имеет ровно один символ ошибки, который классифицирует её. Это наиболее точная классификация ошибок, определённая в языке Emacs Lisp.

Эти узкие классификации объединяются в иерархию более широких классов, называемых условиями ошибки и обозначаемых именами условий. Наиболее узкими из таких классов являются сами символы ошибок: каждый символ ошибки также является именем условия. Существуют и имена условий для более широких классов, вплоть до имени условия error, охватывающего все виды ошибок (но не quit). Таким образом, у каждой ошибки есть одно или несколько имён условий: error, символ ошибки, если он отличается от error, и, возможно, некоторые промежуточные классификации.

Функция: define-error name message &optional parent

Чтобы символ был символом ошибки, его необходимо определить с помощью define-error, которому передаётся родительское условие (по умолчанию error). Этот родитель определяет условия, к которым относится данный тип ошибки. Транзитивное множество родителей всегда включает сам символ ошибки и символ error. Поскольку выход из программы не считается ошибкой, множество родителей для quit состоит только из (quit).

Помимо родителей, у символа ошибки есть сообщение — строка, выводимая при подаче сигнала об этой ошибке, если она не обработана. Если это сообщение недопустимо, используется сообщение об ошибке «peculiar error». См. Определение signal.

Внутренне множество родителей хранится в свойстве error-conditions символа ошибки, а сообщение — в свойстве error-message этого символа.

Вот как определить новый символ ошибки, new-error:

(define-error 'new-error "A new error" 'my-own-errors)

У этой ошибки есть несколько имён условий: new-error — наиболее узкая классификация; my-own-errors, которое, как мы предполагаем, является более широкой классификацией; а также все условия my-own-errors, в которое должно входить error — самое широкое из всех.

Строка ошибки должна начинаться с заглавной буквы, но не должна заканчиваться точкой. Это обеспечивает единообразие с остальной частью Emacs.

Разумеется, Emacs никогда не подаст сигнал new-error самостоятельно; это можно сделать только явным вызовом signal (см. Определение signal) в вашем коде:

(signal 'new-error '(x y))
     error→ A new error: x, y

Эту ошибку можно обработать с помощью любого из её имён условий. В этом примере обрабатывается new-error и любые другие ошибки класса my-own-errors:

(condition-case foo
    (bar nil t)
  (my-own-errors nil))

Ошибки классифицируются главным образом по именам условий — именам, используемым для сопоставления ошибок с обработчиками. Символ ошибки служит лишь удобным способом указать предполагаемое сообщение об ошибке и список имён условий. Было бы неудобно задавать для signal список имён условий вместо одного символа ошибки.

Напротив, использование только символов ошибок без имён условий серьёзно снизило бы возможности condition-case. Имена условий позволяют классифицировать ошибки с разной степенью общности при написании обработчика ошибок. Использование только символов ошибок исключило бы все уровни классификации, кроме самого узкого.

Функция: error-type-p symbol

Эта функция возвращает значение, отличное от nil, если symbol является допустимым именем условия ошибки.

Функция: error-has-type-p error condition

Эта функция проверяет, является ли condition родительским условием символа ошибки из дескриптора ошибки error. Она возвращает значение, отличное от nil, если тип дескриптора ошибки error относится к имени условия condition.

Список основных символов ошибок и соответствующих им условий см. в разделе Стандартные ошибки.

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/Error-Symbols.html

Spec-Zone.ru

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