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ó cleanup
sẽ đượ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-g
hoặc một cuộc gọi đến throw
.
quit
, không có error
giữa cha mẹ của nó). IOW bạn van cũng bắt nó với condition-case
nhưng cho rằng bạn cần phải đi quit
cù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)
.
car
và cdr
. Trả lời cập nhật.
condition-case
bắtkeyboard-quit
?