Webアプリケーションを書く前に、プログラム中で発生した例外をフックして、Internal Server Errorとしてブラウザに表示させるようにしてみます。
(asdf:load-system :clack) ;; swank:backtraceのほうがみやすい? (asdf:load-system :trivial-backtrace) (defpackage :mw-debug (:use :cl :clack)) (in-package :mw-debug) (defun mw-debug-debugger-hook (c hook) (declare (ignore hook)) (let ((restart (find-restart 'mw-debug-restart))) (when (not restart) (error "mw-debug-restart not found")) (invoke-restart restart c (trivial-backtrace:print-backtrace c :output nil)))) (defclass <mw-debug> (<middleware>) ()) (defmethod call ((this <mw-debug>) env) (let ((*debugger-hook* #'mw-debug-debugger-hook)) (restart-case (call-next this env) (mw-debug-restart (c bt) `(500 (:content-type "text/plain") (,(format nil "Internal Server Error~%~%") ,(format nil "-- Error -------------------------------~%") ,(with-output-to-string (*standard-output*) (describe c)) ,(format nil "-- Backtrace ---------------------------~%") ,bt))))))
(defun b (tmp) ;; 未定義の関数を呼び出す。 (c)) (defun a () (b 2)) (defun run (port) (clackup (wrap (make-instance '<mw-debug>) (lambda (env) (a))) :port port)) ;; (run 9999)
Clackで、エラー時にInternal Server Errorにするだけであれば、clackup に :debug nil を渡すだけでできますよ。スタックトレースは吐かないですが
返信削除