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

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

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

Функция: define-error имя сообщение &optional родитель

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

В дополнение к своим родителям, символ ошибки имеет сообщение, которое представляет собой строку, выводимую при инициировании этой ошибки, но не при её обработке. Если это сообщение недействительно, используется сообщение об ошибке ‘особая ошибка’. См. Определение signal.

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

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

(define-error '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→ Новая ошибка: x, y

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

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

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

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

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