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ý và độ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 ...)))))
Nguồn
2009-10-13 02:57:16
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
@kunjaan Tôi đã cập nhật câu trả lời của mình. –