Eu gostaria de uma maneira de capturar erros ao executar meu arquivo init e, em seguida, manipulá-los normalmente. Muitas das minhas personalizações e combinações de teclas mais importantes aparecem no final do meu arquivo init para garantir que outras configurações não sejam aplicadas por cima delas. O problema é que, quando a inicialização é interrompida mais cedo, sinto-me totalmente incapacitado ao tentar depurar o problema sem que minhas ligações e configurações familiares sejam aplicadas.
Existe alguma maneira de concluir normalmente o processo de inicialização quando ocorrer um erro?
fonte
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.with-demoted-errors
está disponível apenas em 24.4@Dan descreveu bem como você pode transformar erros em mensagens. Você também pode fazer o que quiser com erros usando
condition-case
. Ainda outra opção é usarunwind-protect
.Vou ficar
condition-case
aqui, sem motivo algum.Captura do erro
Isso sempre deve garantir que suas principais definições sejam avaliadas, independentemente do que aconteceu lá dentro
condition-case
. Qualquer erro é armazenado dentroinit-error
.Jogando de volta
Depois, basta lançar o erro novamente. Existem várias maneiras de fazer isso, aqui está uma.
fonte
unwind-protect
faz com que o erro seja imediatamente gerado novamente, após a execução de qualquer código que você inserir na cláusula de resgate. É comofinally
em uma linguagem como Java, em vez decatch
.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 derequire
: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
chamadawith-demoted-errors
(eu a escrevi antes de conhecerwith-demoted-errors
), mas o ponto importante é que você pode implementar algo como a combinação de Danwith-demoted-errors
eunwind-protect
sem quebra de Dan (potencialmente muito longa) blocos de código.fonte
eval-buffer
. Obrigado por publicá-lo.