Clojure:
Xử lý lỗi

Cách thực hiện:

Clojure, giống như tổ tiên Lisp của mình, dựa vào ngoại lệ để xử lý lỗi. Dưới đây là cách bạn thể hiện bản thân khi mọi thứ trở nên tồi tệ.

Ném một ngoại lệ là điều dễ dàng:

(throw (Exception. "Ối! Có gì đó sai sai."))

Bắt một ngoại lệ, bạn sẽ làm điều này rất nhiều:

(try
  ;; mã có rủi ro
  (/ 1 0)
  (catch ArithmeticException e
    (println "Không thể chia cho không!"))
  ;; khối finally chạy bất kể điều gì xảy ra
  (finally 
    (println "Mã dọn dẹp được đặt ở đây.")))

Đầu ra mẫu cho khối catch phía trên:

Không thể chia cho không!
Mã dọn dẹp được đặt ở đây.

Sử dụng ex-infoex-data để cung cấp ngữ cảnh phong phú hơn về ngoại lệ:

(try
  ;; gây ra một ngoại lệ tự tạo
  (throw (ex-info "Lỗi tự tạo" {:loại :lỗi-tùy-chỉnh}))
  (catch Exception e
    ;; lấy dữ liệu từ ngoại lệ tự tạo của chúng ta
    (println (ex-data e))))

Đầu ra mẫu:

{:loại :lỗi-tùy-chỉnh}

Sâu hơn

Câu chuyện xử lý lỗi trong Clojure không có gì khác biệt ngoại lệ so với các Lisps khác hay thậm chí Java (từ đó nó kế thừa cơ chế try-catch). Nó thực dụng; sử dụng ngoại lệ là con đường chính, giống như Java, nhưng Clojure cung cấp một hương vị hàm với ex-infoex-data cho dữ liệu lỗi phong phú hơn.

Các phương án thay thế cho xử lý lỗi trong Clojure bao gồm sử dụng các cấu trúc monadic, như monad either từ các thư viện như cats, hoặc core.async cho việc truyền bá lỗi dựa trên kênh. Tuy nhiên, những điều này phức tạp hơn và được sử dụng trong các tình huống cụ thể.

Lịch sử, xử lý lỗi trong các ngôn ngữ lập trình đã phát triển từ việc trả về trạng thái đơn giản đến các cơ chế xử lý ngoại lệ phức tạp hơn của các ngôn ngữ hiện đại. Clojure chọn sự đơn giản và một chút hương vị lập trình hàm, kết hợp cũ và mới.

Xem thêm