Другие ответы довольно хорошо охватили средства обработки ошибок низкого уровня, которые будут полезны в таком случае. Другой подход, который может помочь, - это модульность. Например, я делю свой файл инициализации на несколько разных файлов (используя provide
при необходимости) и загружаю их, используя эту функцию вместо require
:
(defun my/require-softly (feature &optional filename)
"As `require', but instead of an error just print a message.
If there is an error, its message will be included in the message
printed.
Like `require', the return value will be FEATURE if the load was
successful (or unnecessary) and nil if not."
(condition-case err
(require feature filename)
(error (message "Error loading %s: \"%s\""
(if filename (format "%s (%s)" feature filename) feature)
(error-message-string err))
nil)))
Ошибка при загрузке файла таким способом все равно будет печатать сообщение, но это не помешает выполнению чего-либо за пределами файла, где эта ошибка действительно произошла.
Конечно, эта функция на самом деле не так уж отличается от упаковки require
вызова with-demoted-errors
(я написал ее раньше, чем я знал with-demoted-errors
), но важный момент заключается в том, что вы можете по существу реализовать что-то вроде комбинации Дэна with-demoted-errors
и unwind-protect
без переноса (потенциально очень долго) блоки кода.
with-demoted-errors
. Вы можете добавить строковый аргумент к нему, например"LOOK OVER HERE!!! %s"
, так что вы вряд ли пропустите ошибку в буфере сообщений.