Clojure:
טיפול בשגיאות

איך לעשות:

Clojure, כמו אבותיו ה-Lisp, נשען על חריגים למטרת טיפול בשגיאות. הנה איך אתה מראה מה יש לך כשהדברים הולכים לאיבוד.

זריקת חריג היא ישירה:

(throw (Exception. "אופס! משהו השתבש."))

תפיסת חריג, תעשה את זה הרבה:

(try
  ;; קוד מסוכן
  (/ 1 0)
  (catch ArithmeticException e
    (println "לא ניתן לחלק באפס!"))
  ;; finally block ירוץ לא משנה מה
  (finally 
    (println "קוד לניקוי מופיע כאן.")))

פלט לדוגמא עבור הבלוק catch לעיל:

לא ניתן לחלק באפס!
קוד לניקוי מופיע כאן.

שימוש ב-ex-info ו-ex-data עבור הקשר עשיר יותר לגבי חריגים:

(try
  ;; גרימה לחריג מותאם אישית
  (throw (ex-info "שגיאה מותאמת אישית" {:type :custom-failure}))
  (catch Exception e
    ;; חילוץ הנתונים מהחריג המותאם אישית שלנו
    (println (ex-data e))))

פלט לדוגמא:

{:type :custom-failure}

צלילה עמוקה

סיפור טיפול השגיאות ב-Clojure אינו שונה מהותית משפות ליספ אחרות או אפילו מ-Java (ממנו הוא יורש את מנגנון ה-try-catch). זה פרגמטי; שימוש בחריגים הוא הדרך הראשית, בדיוק כמו ב-Java, אך Clojure מציע טעם פונקציונאלי עם ex-info ו-ex-data לנתוני שגיאה עשירים יותר.

אלטרנטיבות לטיפול בשגיאות ב-Clojure כוללות שימוש במבנים מונדיים, כמו מונד either מספריות כמו cats, או core.async להפצת שגיאות מבוססת ערוצים. עם זאת, אלה מורכבות יותר ומשמשות בתרחישים ספציפיים.

באופן היסטורי, טיפול בשגיאות בשפות תכנות התפתח מחזרה פשוטה של סטטוסים למנגנוני טיפול בחריגים יותר מתוחכמים של שפות מודרניות. Clojure בוחר בפשטות ובנגיעה של תכנות פונקציונלי, משלב בין הישן והחדש.

ראה גם