Мне бы хотелось, чтобы при запуске моего файла инициализации обнаруживались ошибки, а затем они корректно обрабатывались. Многие мои самые важные настройки и сочетания клавиш отображаются в конце моего файла инициализации, чтобы убедиться, что другие параметры не применяются поверх них. Проблема состоит в том, что когда инициализация прерывается рано, я чувствую себя полностью утомленным, пытаясь отладить проблему без применения моих знакомых привязок клавиш и настроек.
Есть ли способ изящно завершить процесс инициализации при возникновении ошибки?
источник
with-demoted-errors
. Вы можете добавить строковый аргумент к нему, например"LOOK OVER HERE!!! %s"
, так что вы вряд ли пропустите ошибку в буфере сообщений.with-demoted-errors
доступна только в 24.4@ Дэн хорошо описал, как можно превратить ошибки в сообщения. Вы также можете делать что угодно с ошибками, используя
condition-case
. Еще один вариант заключается в использованииunwind-protect
.Я буду придерживаться
condition-case
здесь без всякой причины.Поймать ошибку
Это всегда должно гарантировать, что ваши ключевые определения будут оценены, независимо от того, что произошло внутри
condition-case
. Любая ошибка хранится внутриinit-error
.Бросив его обратно
После этого просто сгенерируйте ошибку снова. Есть несколько способов сделать это, вот один.
источник
unwind-protect
приводит к немедленному повторному возникновению ошибки после выполнения любого кода, который вы вставили в его условие восстановления. Это похожеfinally
на язык, такой как Java, а неcatch
.Другие ответы довольно хорошо охватили средства обработки ошибок низкого уровня, которые будут полезны в таком случае. Другой подход, который может помочь, - это модульность. Например, я делю свой файл инициализации на несколько разных файлов (используя
provide
при необходимости) и загружаю их, используя эту функцию вместоrequire
:Ошибка при загрузке файла таким способом все равно будет печатать сообщение, но это не помешает выполнению чего-либо за пределами файла, где эта ошибка действительно произошла.
Конечно, эта функция на самом деле не так уж отличается от упаковки
require
вызоваwith-demoted-errors
(я написал ее раньше, чем я зналwith-demoted-errors
), но важный момент заключается в том, что вы можете по существу реализовать что-то вроде комбинации Дэнаwith-demoted-errors
иunwind-protect
без переноса (потенциально очень долго) блоки кода.источник
eval-buffer
. Спасибо за публикацию.