どのようにキャッチミスをPLTSchemeん?
-
21-09-2019 - |
質問
私はPLTSchemeで「エラー」機能により、驚いています。 私はゼロ除算を持っている場合、それは他の再帰を行うだけコールスタックから出てくると私にエラーを与えるdoesntの。
すべての関数の前に暗黙の継続はありますか?エラーは、コールスタックを捨てていますか?誰もがこのことについてどんな考えを持っていますか?
解決
エラー文字列を含む、の失敗:
PLTスキーム、手順では、のエラーのはのEXN例外が発生します。すべての定義には「暗黙のキャッチ」はありません。次のサンプルを見ます:
;; test.ss
(define (a d)
(printf "~a~n" (/ 10 d)))
(a 0) ;; The interpreter will exit here.
(printf "OK~n")
コマンドラインから上記のスクリプトを実行します。
のようなものを印刷した後、既存の通訳が表示されます/: division by zero
=== context ===
/home/user/test.ss:1:0: a
例外は、ユーザプログラム内で処理されていない場合は、は、デフォルトのハンドラは例外と終了を印刷すなわち、それを扱うコアインタプリタまで伝播されます。言い換えれば、インタプリタは単に「例外が発生したと私はそれに対処する方法がわからないので、私はquitingています」、と言います。これは、JVMまたはいくつかの他の仮想マシンが例外を処理する方法とそれほど違いはありません。
// WWW:PLT Schemeの例外処理メカニズムの詳細については、<のhref = "HTTPでのと-ハンドラとダイナミックな風の約読みください。 cs.rice.edu/CS/PLT/packages/100/pdf/mzscheme.pdf」のrel = "nofollowをnoreferrer"> MzSchemeの言語マニュアルに。これらを使用して、あなたもJavaののtry-catch-finallyブロックをエミュレートすることができます。
(define (d a b)
(try
(printf "~a~n" (/ a b))
(catch (lambda (ex)
(printf "Error: ~a" ex)))
(finally
(if (> b -2)
(d a (sub1 b))))))
ここで上記可能にした構文拡張はあります:
;; try-catch-finally on top of with-handlers and dynamic-wind.
(define-syntax try
(syntax-rules (catch finally)
((_ try-body ... (catch catch-proc))
(with-handlers (((lambda (ex) #t)
(lambda (ex)
(catch-proc ex))))
(begin
try-body ...)))
((_ try-body ... (catch catch-proc) (finally fin-body ...))
(dynamic-wind
(lambda () ())
(lambda ()
(with-handlers (((lambda (ex) #t)
(lambda (ex)
(catch-proc ex))))
(begin
try-body ...)))
(lambda () fin-body ...)))
((_ try-body ... (finally fin-body ...))
(dynamic-wind
(lambda () ())
(lambda () try-body ...)
(lambda () fin-body ...)))))
所属していません StackOverflow