Clojure:
การจัดการกับข้อผิดพลาด

วิธีการ:

Clojure, เช่นเดียวกับบรรพบุรุษ Lisp ของมัน ใช้เลิศด้วยการเกิดข้อผิดพลาด นี่คือวิธีที่คุณแสดงความสามารถเมื่อสถานการณ์ไม่ดี

การโยนข้อผิดพลาดเป็นเรื่องง่าย:

(throw (Exception. "อุ๊ปส์! เกิดข้อผิดพลาด."))

การจับข้อผิดพลาด คุณจะทำสิ่งนี้บ่อยมาก:

(try
  ;; โค้ดที่มีความเสี่ยง
  (/ 1 0)
  (catch ArithmeticException e
    (println "ไม่สามารถหารด้วยศูนย์ได้!"))
  ;; บล็อก finally จะทำงานไม่ว่าอย่างไร
  (finally 
    (println "โค้ดทำความสะอาดที่นี่.")))

ผลลัพธ์ตัวอย่างสำหรับบล็อกการจับข้างต้น:

ไม่สามารถหารด้วยศูนย์ได้!
โค้ดทำความสะอาดที่นี่.

การใช้ ex-info และ ex-data เพื่อให้ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาด:

(try
  ;; ทำให้เกิดข้อผิดพลาดที่กำหนดเอง
  (throw (ex-info "ข้อผิดพลาดที่กำหนดเอง" {:type :custom-failure}))
  (catch Exception e
    ;; การดึงข้อมูลจากข้อผิดพลาดที่กำหนดเองของเรา
    (println (ex-data e))))

ผลลัพธ์ตัวอย่าง:

{:type :custom-failure}

การศึกษาลึก

เรื่องราวการจัดการข้อผิดพลาดใน Clojure ไม่แตกต่างกันอย่างมากจาก Lisps อื่น ๆ หรือแม้แต่ Java (ที่มันได้รับกลไก try-catch มา). มันเป็นเรื่องที่เป็นประโยชน์; การใช้ข้อยกเว้นเป็นเส้นทางหลัก เช่นเดียวกับ Java แต่ Clojure เสนอรสชาติการเขียนโปรแกรมแบบฟังก์ชันด้วย ex-info และ ex-data สำหรับข้อมูลข้อผิดพลาดที่มีความหลากหลายมากขึ้น

อีกทางเลือกสำหรับการจัดการข้อผิดพลาดใน Clojure ประกอบด้วยการใช้โครงสร้างมอนาด เช่น มอนาด either จากไลบรารีเช่น cats, หรือ core.async สำหรับการเพิ่มข้อผิดพลาดที่อิงตามช่อง อย่างไรก็ตาม เหล่านี้มีความซับซ้อนมากขึ้นและใช้ในสถานการณ์เฉพาะ

ตามประวัติศาสตร์ การจัดการข้อผิดพลาดในภาษาการเขียนโปรแกรมได้พัฒนาไปจากการส่งคืนสถานะง่ายๆ ไปสู่กลไกการจัดการข้อผิดพลาดที่ซับซ้อนมากขึ้นของภาษาสมัยใหม่ Clojure เลือกความเรียบง่ายและสัมผัสของการเขียนโปรแกรมแบบฟังก์ชัน ผสานรูปแบบเก่าและใหม่เข้าด้วยกัน

ดูเพิ่มเติม