Quisiera una forma de detectar errores al ejecutar mi archivo init y luego manejarlos con gracia. Muchas de mis personalizaciones y combinaciones de teclas más importantes aparecen al final de mi archivo init para asegurarme de que no se apliquen otras configuraciones por encima de ellas. El problema es que cuando la inicialización se interrumpe temprano, me siento totalmente paralizado tratando de depurar el problema sin que se apliquen mis configuraciones y enlaces de teclas familiares.
¿Hay alguna forma de finalizar con gracia el proceso de inicialización cuando se produce un error?
fuente
with-demoted-errors
. Puede agregarle un argumento de cadena"LOOK OVER HERE!!! %s"
, por lo que es menos probable que pierda el error en el búfer de mensajes.with-demoted-errors
solo está disponible en 24.4@Dan describió bien cómo puede convertir los errores en mensajes. También puede hacer lo que quiera con errores mediante el uso
condition-case
. Otra opción más es usarunwind-protect
.Me quedaré
condition-case
aquí, sin ninguna razón.Capturando el error
Esto siempre debería garantizar que sus definiciones clave sean evaluadas, independientemente de lo que sucedió en su interior
condition-case
. Cualquier error se almacena dentroinit-error
.Arrojándolo de vuelta
Luego, simplemente arroje el error nuevamente. Hay varias formas de hacerlo, aquí hay una.
fuente
unwind-protect
hace que el error se vuelva a generar inmediatamente, después de ejecutar el código que haya puesto en su cláusula de rescate. Es comofinally
en un lenguaje como Java, en lugar decatch
.Las otras respuestas han cubierto bastante bien las facilidades de manejo de errores de bajo nivel que serán útiles en un caso como este. Otro enfoque que puede ayudar es la modularidad. Por ejemplo, divido mi archivo de inicialización en varios archivos diferentes (usando
provide
según corresponda), y los cargo usando esta función en lugar derequire
:Un error al cargar un archivo de esta manera seguirá imprimiendo un mensaje, pero no impedirá la ejecución de nada fuera del archivo donde realmente ocurrió el error.
Por supuesto, esta función no es realmente tan diferente de terminar una
require
llamadawith-demoted-errors
(la escribí antes de saberlowith-demoted-errors
), pero el punto importante es que esencialmente puede implementar algo como la combinación de Dan sinwith-demoted-errors
y conunwind-protect
ajuste (potencialmente muy largo) bloques de códigofuente
eval-buffer
. Gracias por publicarlo.