Rethrowing ข้อผิดพลาดใน Emacs Lisp


9

ฉันจำเป็นต้องเรียกใช้ฟังก์ชันและดำเนินการล้างเท่านั้นถ้าฟังก์ชันล้มเหลวแล้วสังข์ข้อผิดพลาด นี่คือรหัสเทียม:

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

คำตอบ:


10

BTW ตัวเลือกทางเลือกอาจเป็นเช่น:

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

ข้อดีคือคุณหลีกเลี่ยงการจับข้อผิดพลาดซ้ำซึ่งหมายความว่าตัวดีบักจะแสดง backtrace ที่ถูกต้อง (อันที่สอดคล้องกับแหล่งที่มาของความผิดพลาดจริงแทนที่จะเป็นข้อผิดพลาดของคนอื่นที่สอดคล้องกับคุณ )

ความแตกต่างอีกประการหนึ่งคือcleanupจะถูกเรียกไม่เพียง แต่เมื่อเกิดข้อผิดพลาดเท่านั้น แต่หากรหัสถูกขัดจังหวะโดยC-gการเรียกthrowหรือ


1
ขอบคุณ ทำไมจะไม่condition-caseจับkeyboard-quit?
Elena

3
เนื่องจากไม่ใช่ข้อผิดพลาด (เช่นสัญญาณquit, ไม่มีerrorในหมู่ผู้ปกครอง) IOW คุณแวนยังจับมันด้วยcondition-caseแต่การที่คุณจะต้องใส่พร้อมกับquit errorแน่นอนว่ายังไม่สามารถจัดการกับคดี 'โยน' ได้
Stefan

13

คุณกำลังมองหาsignal:

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

ฉันได้รับการพิจารณาsignalแต่ต้นแบบของมันคือไม่(signal ERROR-SYMBOL DATA) (signal ERROR)
Elena

@Elena สิทธิขออภัยคุณต้องดึงมันออกจากกันด้วยและcar cdrอัปเดตคำตอบแล้ว
npostavs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.