As outras respostas cobriram muito bem os recursos de tratamento de erros de baixo nível que serão úteis em um caso como esse. Outra abordagem que pode ajudar é a modularidade. Por exemplo, divido meu arquivo de inicialização em vários arquivos diferentes (usando provide
conforme apropriado) e carrego-os usando esta função em vez de 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)))
Um erro ao carregar um arquivo dessa maneira ainda imprimirá uma mensagem, mas não impedirá a execução de nada fora do arquivo em que o erro realmente ocorreu.
Obviamente, essa função não é tão diferente de encerrar uma require
chamada with-demoted-errors
(eu a escrevi antes de conhecer with-demoted-errors
), mas o ponto importante é que você pode implementar algo como a combinação de Dan with-demoted-errors
e unwind-protect
sem quebra de Dan (potencialmente muito longa) blocos de código.
with-demoted-errors
. Você pode adicionar um argumento de string a ele"LOOK OVER HERE!!! %s"
, para ter menos chances de perder o erro no buffer de mensagens.