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 เลือกความเรียบง่ายและสัมผัสของการเขียนโปรแกรมแบบฟังก์ชัน ผสานรูปแบบเก่าและใหม่เข้าด้วยกัน
ดูเพิ่มเติม
- คู่มือข้อยกเว้นของ Clojure: https://clojure.org/guides/exceptions
- ไลบรารี “Cats” สำหรับวิธีการแบบฟังก์ชันมากขึ้น: https://github.com/funcool/cats
- “Core.async” สำหรับการเขียนโปรแกรมแบบอะซิงโครนัส: https://github.com/clojure/core.async