最初に#7755661をご覧ください。私は ECL を使用しており、基本的には何らかのコードを実行し、発生する可能性のあるあらゆる種類の状態をトラップしてから、プロンプトを表示したりデバッガーに入ったりせずに実行を継続したいと考えています。これは、次のハンドラー ケース マクロを使用すると簡単に実現できます。
(handler-case
(load "code.lisp") ; this may raise a condition
(error (condition)
(print condition))) ; this prints sth like #<a UNBOUND-VARIABLE>
私の唯一の問題は、ユーザーにとってより意味のあるエラーを出力する一般的な方法が見つからないことです。実際、私のアプリケーションは HTTP サーバーであり、出力は Web ページに送られます。code.lisp はユーザーによって作成され、あらゆる種類の条件を発生させることができます。コード内でそれらすべてをリストしたいと思います。ハンドラーケースを使用しない場合に REPL に表示されるのと同じエラーメッセージを出力したいだけですが、HTML ページには、たとえば「バインドされていない変数」エラーの場合、「変数 VAR はバインドされていません」のような文字列が表示されます。
タイプの条件オブジェクトUNBOUND-VARIABLE
を調べると、2 つのスロットがあることがわかります。SI:REPORT-FUNCTION
はコンパイルされた関数でありSI:NAME
、この場合は変数の名前に設定されます。呼び出す必要があると思いSI:REPORT-FUNCTION
ますが、どのように呼び出すことができますか? 私が試してみると:
(handler-case foo (error (condition) (SI::REPORT-FUNCTION condition)))
SI:REPORT-FUNCTION が定義されていないことがわかります。ECL の SI または SYS は、実装内部の関数と変数のパッケージですが、動作する限り、コードが移植可能でなくても心配ありません。
SI:FORMAT-CONTROL
ところで、他の種類の条件オブジェクトには、とという名前の目的のために明らかに役立つ他のスロットもSI:FORMAT-ARGUMENT
ありますが、コードからもそれらのいずれにもアクセスできません。
getMessage()
Lisp の Java 例外オブジェクトのメソッドに似たものを探していましたが、そのようなことについて言及している情報源はありません。
さらに、エラーが発生した code.lisp の行番号も取得できる希望はありますか? これがなければ、ユーザーは自分の code.lisp ソース ファイルで問題を見つけるのが難しくなります。私は本当にこの情報を提供したいと思っており、最初のエラーで停止しても問題ありません。