コンディションの内容を受け取る


Tag: 【募集中】

handler-bind でハンドリングコードに入ったところを考えてください。

  (handler-bind ((something-happened #'my-handler)
     (do-something))
  (defun my-handler (c)
     ...)

自ら定義したコンディションである something-happened の定義を見てみましょう。

  (define-condition something-happened (simple-error)
    ((foo :initarg :foo :reader foo)))

コンディションオブジェクトは普通のCLOSオブジェクトですので、 もし slot foo に何らかのデータが格納されていれば、

  (defun my-handler (c)
     (format *error-output*
             "~&error value is ~a." (foo c))

で読み出すことができます。 もちろん、readerを使わずとも普通に

  (defun my-handler (c)
     (format *error-output*
             "~&error value is ~a." (slot-value 'foo c))

でも構いません。ただ、slot-value は基本的に bad practice だということは心に止めておいてください。(コンパイラが最適化してくれない、API化したときにオブジェクトを隠蔽できない)