Spec-Zone.ru › Elisp

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

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

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

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

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

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

Внутренне, набор родителей хранится в свойстве 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 '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. Имена условий позволяют категоризировать ошибки на разных уровнях обобщения при написании обработчика ошибок. Использование только символов ошибок устранит все уровни классификации, кроме самых узких.

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

Copyright © 1990-1996, 1998-2022 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