Je voudrais un moyen de détecter les erreurs lors de l'exécution de mon fichier init, puis de les gérer avec élégance. Un grand nombre de mes personnalisations et raccourcis clavier les plus importants s'affichent à la fin de mon fichier init pour s'assurer que les autres paramètres ne sont pas appliqués par-dessus eux. Le problème est que lorsque l'initialisation s'interrompt tôt, je me sens totalement paralysé en essayant de déboguer le problème sans que mes liaisons de touches et paramètres familiers soient appliqués.
Existe-t-il un moyen de terminer avec élégance le processus d'initialisation lorsqu'une erreur se produit?
la source
with-demoted-errors
. Vous pouvez y ajouter un argument de type chaîne"LOOK OVER HERE!!! %s"
, de sorte que vous risquez moins de manquer l'erreur dans le tampon des messages.with-demoted-errors
est uniquement disponible en 24.4@Dan a bien décrit comment transformer des erreurs en messages. Vous pouvez également faire tout ce que vous voulez avec des erreurs en utilisant
condition-case
. Encore une autre option est d'utiliserunwind-protect
.Je m'en tiendrai
condition-case
ici, sans aucune raison.Attraper l'erreur
Cela devrait toujours garantir que vos définitions de clés soient évaluées, indépendamment de ce qui s'est passé à l'intérieur
condition-case
. Toute erreur est stockée à l'intérieurinit-error
.Le rejeter
Ensuite, renvoyez simplement l'erreur. Il existe plusieurs façons de le faire, en voici une.
la source
unwind-protect
entraîne la ré-augmentation immédiate de l'erreur, après l'exécution du code que vous avez inséré dans sa clause de sauvetage. C'est commefinally
dans un langage comme Java, plutôt quecatch
.Les autres réponses ont assez bien couvert les fonctionnalités de gestion des erreurs de bas niveau qui seront utiles dans un cas comme celui-ci. Une autre approche qui peut aider est la modularité. Par exemple, je divise mon fichier d'initialisation en plusieurs fichiers différents (en utilisant
provide
le cas échéant), et je les charge en utilisant cette fonction au lieu derequire
:Une erreur lors du chargement d'un fichier de cette manière affichera toujours un message, mais cela n'empêchera pas l'exécution de quoi que ce soit en dehors du fichier où l'erreur s'est réellement produite.
Bien sûr, cette fonction n'est pas vraiment différente de l'habillage d'un
require
appelwith-demoted-errors
(je l'ai écrit avant que je le sachewith-demoted-errors
), mais le point important est que vous pouvez essentiellement implémenter quelque chose comme la combinaison dewith-demoted-errors
etunwind-protect
sans l'habillage de Dan (potentiellement très longue) blocs de code.la source
eval-buffer
. Merci de l'avoir posté.