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エラーが発生したときだけでなく、C-gまたはへの呼び出しによってコードが中断された場合にも呼び出されることthrowです。


1
ありがとう。なぜでしょうcondition-caseキャッチkeyboard-quit
Elena

3
これはエラーではないためです(つまり、その信号はその親の中quitにありませんerror)。IOWあなたもヴァンでそれをキャッチcondition-caseしますが、そのためにはあなたがquit一緒に置く必要がありますerror。もちろん、それでも「スロー」のケースは処理されません。
Stefan

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 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.