Emacs Lisp'de bir hatayı geri alma


9

Bir işlevi çağırmak ve yalnızca işlev başarısız olduğunda bir temizleme gerçekleştirmek ve sonra hatayı yeniden başlatmak gerekir. İşte sözde kod:

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

Yanıtlar:


10

BTW, alternatif bir seçenek şöyle olabilir:

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

Avantajı, hatayı yakalamaktan ve yeniden atmaktan kaçınmanızdır; bu, örneğin hata ayıklayıcının size başka bir kişinin hatasını tekrar atmak yerine doğru geri izini (hatanın gerçek kaynağına karşılık gelen olanı) göstereceği anlamına gelir. ).

Diğer bir fark ise, cleanupsadece hata durumunda değil, kod bir C-gveya çağrısıyla kesildiğinde de çağrılacaktır throw.


1
Teşekkürler. Neden condition-caseyakalamasın ki keyboard-quit?
Elena

3
Çünkü bu bir hata değildir (yani sinyali, ebeveynleri arasında quityoktur error). IOW Eğer Van da onu yakalamak condition-casesen koymak gerektiğini ancak için quitbirlikte error. Tabii ki, bu hala `` atış '' davasını ele almayacak.
Stefan

13

Şunu arıyorsunuz signal:

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

Düşündüm signal, ama prototipi (signal ERROR-SYMBOL DATA)değil (signal ERROR).
Elena

@Elena: doğru üzgünüm, carve ile ayırdınız cdr. Yanıt güncellendi.
npostavs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.