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`?
   ))

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.


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'

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.