回答:
どちらも完璧ではない2つのオプションが思い浮かびます。最初に、初期初期化コードの大部分(つまり、カスタマイズに到達する前)をラップできます(ignore-errors ...)
。ただし、エラーがある場合、多くのフィードバックはありません- ignore-errors
単に戻りnil
ます。
より複雑なオプションは、潜在的にバグのあるコードをunwind-protect
and with-demoted-errors
(debug-on-error
nilに設定)の組み合わせでラップすることです。後者は、最初に発生したエラーで優雅にエラーを出し、エラーメッセージを*Messages*
バッファに報告して検査します。その間、unwind-protect
ボディの残りの部分(おそらくカスタマイズ)が評価されます。したがって、たとえば:
(unwind-protect
(let ((debug-on-error nil))
(with-demoted-errors
(message "The world is about to end")
(sleep-for 2)
(/ 10 0) ; divide by zero signals an error
(message "This will never evaluate")
(sleep-for 2)
(setq some-var 5)))
(message "Here are the unwind forms that will always evaluate")
(sleep-for 2)
(setq some-var 10)
(setq another-var "puppies")
(message "All done!"))
with-demoted-errors
24.4
@Danは、エラーをメッセージに変換する方法を説明しました。また、を使用して、エラーが発生したときに何でもできます
condition-case
。さらに別のオプションはを使用すること
unwind-protect
です。
condition-case
理由もなく、ここに固執します。
これにより、内部で何が起こったかに関係なく、常にキー定義が評価されることが保証されますcondition-case
。エラーはすべてに保存されinit-error
ます。
(defvar init-error nil
"The error which happened.")
(condition-case the-error
(progn
;; Do the dangerous stuff here.
(require 'what-I-want))
(error
;; This is only evaluated if there's an error.
(setq init-error the-error)))
;;; Do the safe stuff here.
(define-key uncrippling-map "\C-h" 'help!)
その後、もう一度エラーをスローします。これを行うにはいくつかの方法がありますが、ここに1つあります。
;;; Throw the error again here.
(when init-error
(funcall #'signal (car init-error) (cdr init-error)))
unwind-protect
レスキュー句に記述したコードを実行した後、エラーが直ちに再発生します。それfinally
は、Java のような言語ではなく、Java のようなものcatch
です。
他の答えは、このような場合に役立つ低レベルのエラー処理機能を十分にカバーしています。役立つ別のアプローチは、モジュール性です。たとえば、初期化ファイルを(provide
必要に応じて)いくつかの異なるファイルに分割し、次の代わりにこの関数を使用してロードしますrequire
。
(defun my/require-softly (feature &optional filename)
"As `require', but instead of an error just print a message.
If there is an error, its message will be included in the message
printed.
Like `require', the return value will be FEATURE if the load was
successful (or unnecessary) and nil if not."
(condition-case err
(require feature filename)
(error (message "Error loading %s: \"%s\""
(if filename (format "%s (%s)" feature filename) feature)
(error-message-string err))
nil)))
この方法でファイルをロード中にエラーが発生した場合でもメッセージは出力されますが、実際にエラーが発生したファイルの外部での実行は防止されません。
もちろん、この機能はラップは異なるということは本当にないrequire
でコールがwith-demoted-errors
(私が知っていた前に、私はそれを書いたwith-demoted-errors
)、しかし重要な点は、それはあなたが本質的にダンの組み合わせのようなものを実装できるということであるwith-demoted-errors
とunwind-protect
(潜在的に非常に長い)ラッピングなしにコードのブロック。
eval-buffer
。投稿してくれてありがとう。
with-demoted-errors
。文字列引数をのよう"LOOK OVER HERE!!! %s"
に追加できます。そのため、メッセージバッファのエラーを見逃す可能性が低くなります。