2009-10-13 23 views
5

Tôi ngạc nhiên bởi hàm "lỗi" trong PLTScheme. Nếu tôi có một bộ phận bằng không, nó không làm bất kỳ đệ quy khác và chỉ đi ra khỏi ngăn xếp cuộc gọi và cho tôi một lỗi.Lỗi PLTScheme Catch như thế nào?

Có sự tiếp tục tiềm ẩn trước tất cả các chức năng không? Lỗi có vứt bỏ ngăn xếp cuộc gọi không? Có ai có bất kỳ ý tưởng về điều này?

Trả lời

6

Trong sơ đồ PLT, thủ tục lỗi tăng ngoại lệ exn: lỗi, có chứa một chuỗi lỗi. Không có "bắt tiềm ẩn" cho tất cả các định nghĩa. Nhìn vào mẫu sau:

;; test.ss 
(define (a d) 
    (printf "~a~n" (/ 10 d))) 

(a 0) ;; The interpreter will exit here.  
(printf "OK~n") 

Thực thi kịch bản trên từ dòng lệnh và bạn sẽ thấy những thông dịch viên hiện có sau khi in một cái gì đó giống như

/: division by zero 

=== context === 
/home/user/test.ss:1:0: a 

Nếu một ngoại lệ không được xử lý trong chương trình người dùng, nó được truyền đến trình thông dịch lõi, nơi một trình xử lý mặc định xử lý nó, tức là in ra ngoại lệ và thoát. Nói cách khác, thông dịch viên chỉ nói, "một ngoại lệ đã được nêu ra và tôi không biết làm thế nào để đối phó với nó, vì vậy tôi đang quiting". Điều này không khác nhiều so với cách JVM hoặc một số máy ảo khác xử lý các ngoại lệ.

Để tìm hiểu thêm về cơ chế xử lý ngoại lệ PLT Scheme, vui lòng đọc về với-xử lýđộng-gió trong MzScheme Language Manual. Sử dụng chúng, bạn thậm chí có thể mô phỏng khối try-catch-finally của Java.

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

Đây là phần mở rộng cú pháp mà làm trên có thể:

;; 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

này đã không được những gì tôi đang tìm kiếm. Trong Đề án, hầu hết các chức năng tự động kiểm tra phân chia bằng 0 và các lỗi khác, điều đó xảy ra như thế nào? Là bắt tiềm ẩn trong tất cả các định nghĩa? – unj2

+0

@kunjaan Tôi đã cập nhật câu trả lời của mình. –

Các vấn đề liên quan