Інші відповіді досить добре висвітлювали засоби низького рівня помилок, які будуть корисні у такому випадку. Ще один підхід, який може допомогти, - модульність. Наприклад, я поділяю свій файл ініціалізації на кілька різних файлів (використовуючи, 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"
, тому ви рідше пропустите помилку в буфері повідомлень.