Повторна помилка в Emacs Lisp


9

Мені потрібно викликати функцію та виконати очищення лише у тому випадку, коли функція не працює, а потім повторно запустити помилку. Ось псевдо-код:

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

Відповіді:


10

До речі, альтернативним варіантом може бути щось на зразок:

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

Перевага полягає в тому, що ви уникаєте лову та повторного скидання помилки, а це означає, що, наприклад, налагоджувач покаже вам правильний зворотний шлях (той, що відповідає фактичному джерелу помилки, а не той, що відповідає вам, повторно викидаючи чужу помилку ).

Ще одна відмінність полягає в тому, що cleanupбуде викликано не тільки помилка, але й якщо код буде перервано a C-gабо закликом до throw.


1
Дякую. Чому б не condition-caseзловити keyboard-quit?
Олена

3
Тому що це не помилка (тобто її сигнал quitне є errorсеред батьків). IOW ви ван також зловити його , condition-caseале для цього вам потрібно покласти quitразом з error. Звичайно, це все ще не вирішить справу з кидком.
Стефан

13

Ви шукаєте signal:

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

Я вважав signal, але його прототип - (signal ERROR-SYMBOL DATA)ні (signal ERROR).
Олена

@Elena: правильно вибачте, ви розірвали це з carі cdr. Відповідь оновлено.
npostavs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.