Memikirkan kembali kesalahan dalam Emacs Lisp

9

Saya perlu memanggil fungsi dan melakukan pembersihan hanya jika fungsi gagal, dan kemudian meluncurkan kembali kesalahan. Berikut adalah pseudo-code:

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

Jawaban:

10

BTW, opsi alternatif bisa berupa:

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

Keuntungannya adalah Anda menghindari penangkapan & rethrowing kesalahan, yang berarti misalnya debugger akan menunjukkan kepada Anda backtrace yang tepat (yang sesuai dengan sumber kesalahan yang sebenarnya, daripada yang sesuai dengan Anda melemparkan kembali kesalahan orang lain ).

Perbedaan lain adalah bahwa cleanupakan dipanggil tidak hanya pada kesalahan tetapi juga jika kode terganggu oleh C-gatau panggilan ke throw.

Stefan
sumber
1
Terima kasih. Kenapa tidak condition-casemenangkap keyboard-quit?
Elena
3
Karena itu bukan kesalahan (yaitu sinyalnya,, quittidak ada di errorantara orang tuanya). TUNGGU Anda van juga menangkapnya condition-casetetapi untuk itu Anda harus quitmengikuti error. Tentu saja, itu masih tidak akan menangani kasus `melempar '.
Stefan
13

Anda sedang mencari signal:

(condition-case err
    (call-function)
  (error
   (cleanup)
   (signal (car err) (cdr err)))) ; reraise `err'
npostavs
sumber
Saya sudah mempertimbangkan signal, tapi prototipenya (signal ERROR-SYMBOL DATA)bukan (signal ERROR).
Elena
@ Elena: maaf, Anda harus memisahkannya dengan cardan cdr. Jawaban diperbarui.
npostavs