2009-10-13 3 views
5

PLTScheme의 "오류"기능에 놀랐습니다. 0으로 나누기가 있다면 다른 반복을하지 않고 호출 스택에서 나와서 오류가 발생합니다.PLTScheme는 어떻게 오류를 잡아낼 수 있습니까?

모든 기능을 수행하기 전에 암시 적으로 계속됩니까? 오류가 호출 스택을 버리지는 않았습니까? 아무도 이것에 대해 어떤 생각을 가지고 있습니까? PLT 방식에서

답변

6

절차 오류 예외 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 

뭔가를 인쇄 한 후 기존의 볼 수 있습니다, 기본 인터프리터가 처리하는 핵심 인터프리터까지 전파됩니다. 즉 예외를 인쇄하고 종료합니다. 다른 말로하면, 통역사는 단지 "예외가 제기되었고 그것을 다루는 방법을 모르기 때문에 나는 끝내고있다"고 말합니다. 이것은 JVM이나 다른 가상 머신이 예외를 처리하는 방법과 크게 다르지 않습니다.

PLT 제도의 예외 처리 메커니즘에 대한 자세한 내용은 대한 와-핸들러동적 바람MzScheme Language Manual에서 읽어 보시기 바랍니다. 이들을 사용하여 Java의 try-catch-finally 블록을 에뮬레이션 할 수도 있습니다. 이것은 내가 찾던되지 않은 것을

;; 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 ...))))) 
+0

: 여기

(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)))))) 

가능 위의 만든 구문 확장이다. Scheme에서 대부분의 함수는 0으로 나누기 및 다른 오류를 자동으로 확인합니다. 어떻게됩니까? 모든 정의에 함축 된 암시가 있습니까? – unj2

+0

@kunjaan 답변을 업데이트했습니다. –