Câu trả lời:
BTW, một tùy chọn thay thế có thể là một cái gì đó như:
(let ((error t))
(unwind-protect
(prog1 (call-function)
(setq error nil))
(when error (cleanup))))
Ưu điểm là bạn tránh bắt và sửa lỗi, điều đó có nghĩa là trình gỡ lỗi sẽ hiển thị cho bạn backtrace đúng (tương ứng với nguồn lỗi thực tế, thay vì lỗi tương ứng với việc bạn ném lại lỗi của người khác ).
Một sự khác biệt khác là nó cleanupsẽ được gọi không chỉ do lỗi mà còn nếu mã bị gián đoạn bởi một C-ghoặc một cuộc gọi đến throw.
quit, không có errorgiữa cha mẹ của nó). IOW bạn van cũng bắt nó với condition-casenhưng cho rằng bạn cần phải đi quitcùng với error. Tất nhiên, điều đó vẫn sẽ không xử lý trường hợp 'ném'.
Bạn đang tìm kiếm signal:
(condition-case err
(call-function)
(error
(cleanup)
(signal (car err) (cdr err)))) ; reraise `err'
signal, nhưng nguyên mẫu của nó là (signal ERROR-SYMBOL DATA), không (signal ERROR).
carvà cdr. Trả lời cập nhật.
condition-casebắtkeyboard-quit?