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 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)))
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
llamada with-demoted-errors
(la escribí antes de saberlo with-demoted-errors
), pero el punto importante es que esencialmente puede implementar algo como la combinación de Dan sin with-demoted-errors
y con unwind-protect
ajuste (potencialmente muy largo) bloques de código
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.