Đang sửa lỗi trong Emacs Lisp


9

Tôi cần phải gọi một chức năng và thực hiện dọn dẹp chỉ nếu chức năng thất bại, rồi khởi chạy lại báo lỗi. Đây là mã giả:

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

Câu trả lời:


10

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.


1
Cảm ơn. Tại sao không condition-casebắt keyboard-quit?
Elena

3
Bởi vì đó không phải là một lỗi (tức là tín hiệu của nó 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'.
Stefan

13

Bạn đang tìm kiếm signal:

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

Tôi đã xem xét signal, nhưng nguyên mẫu của nó là (signal ERROR-SYMBOL DATA), không (signal ERROR).
Elena

@Elena: đúng xin lỗi, bạn đã kéo nó ra carcdr. Trả lời cập nhật.
npostavs 04/07/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.