ฉันจำเป็นต้องเรียกใช้ฟังก์ชันและดำเนินการล้างเท่านั้นถ้าฟังก์ชันล้มเหลวแล้วสังข์ข้อผิดพลาด นี่คือรหัสเทียม:
(condition-case err
(call-function)
(error
(cleanup)
;; how do I raise `err`?
))
ฉันจำเป็นต้องเรียกใช้ฟังก์ชันและดำเนินการล้างเท่านั้นถ้าฟังก์ชันล้มเหลวแล้วสังข์ข้อผิดพลาด นี่คือรหัสเทียม:
(condition-case err
(call-function)
(error
(cleanup)
;; how do I raise `err`?
))
คำตอบ:
BTW ตัวเลือกทางเลือกอาจเป็นเช่น:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
ข้อดีคือคุณหลีกเลี่ยงการจับข้อผิดพลาดซ้ำซึ่งหมายความว่าตัวดีบักจะแสดง backtrace ที่ถูกต้อง (อันที่สอดคล้องกับแหล่งที่มาของความผิดพลาดจริงแทนที่จะเป็นข้อผิดพลาดของคนอื่นที่สอดคล้องกับคุณ )
ความแตกต่างอีกประการหนึ่งคือcleanup
จะถูกเรียกไม่เพียง แต่เมื่อเกิดข้อผิดพลาดเท่านั้น แต่หากรหัสถูกขัดจังหวะโดยC-g
การเรียกthrow
หรือ
quit
, ไม่มีerror
ในหมู่ผู้ปกครอง) IOW คุณแวนยังจับมันด้วยcondition-case
แต่การที่คุณจะต้องใส่พร้อมกับquit
error
แน่นอนว่ายังไม่สามารถจัดการกับคดี 'โยน' ได้
condition-case
จับkeyboard-quit
?