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