Riscrivere un errore in Emacs Lisp


9

Devo chiamare una funzione ed eseguire una pulizia solo se la funzione ha esito negativo, quindi riavviare l'errore. Ecco lo pseudo-codice:

(condition-case err
    (call-function)
  (error
   (cleanup)
   ;; how do I raise `err`?
   ))

Risposte:


10

A proposito, un'opzione alternativa può essere qualcosa di simile:

(let ((error t))
  (unwind-protect
      (prog1 (call-function)
        (setq error nil))
    (when error (cleanup))))

Il vantaggio è che eviti di catturare e ricrescere l'errore, il che significa ad esempio che il debugger ti mostrerà il giusto backtrace (quello che corrisponde alla fonte effettiva dell'errore, piuttosto che quello che corrisponde a te nel ripetere l'errore di qualcun altro ).

Un'altra differenza è che cleanupverrà chiamata non solo in caso di errore, ma anche se il codice viene interrotto da una C-go una chiamata a throw.


1
Grazie. Perché non avrebbe condition-casecattura keyboard-quit?
Elena,

3
Perché non è un errore (cioè il suo segnale, quitnon ha errortra i suoi genitori). IOW anche tu il furgone lo afferra, condition-casema per quello devi metterlo quitinsieme error. Ovviamente, questo non gestirà ancora il caso del lancio.
Stefan,

13

Stai cercando signal:

(condition-case err
    (call-function)
  (error
   (cleanup)
   (signal (car err) (cdr err)))) ; reraise `err'

Avevo considerato signal, ma il suo prototipo (signal ERROR-SYMBOL DATA)non lo è (signal ERROR).
Elena,

@Elena: scusa, l'hai fatta a pezzi con care cdr. Risposta aggiornata
npostavs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.