Clojure:
エラー処理
どのように:
ClojureはそのLispの先祖のように、エラー処理に例外を利用します。物事が悪い方向に進んだときにあなたがどう行動するか、ここで見せます。
例外を投げるのは簡単です:
(throw (Exception. "おっと!何か問題が発生しました。"))
例外を捕捉する際に、これを頻繁に行うことになるでしょう:
(try
;; リスクのあるコード
(/ 1 0)
(catch ArithmeticException e
(println "ゼロで割ることはできません!"))
;; finallyブロックは何があっても実行される
(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におけるエラー処理の流れは、他のLispやJava(try-catch
メカニズムを継承している)と根本的に違うわけではありません。それは実用的です。Javaと同様に例外を使用するのが主な方法ですが、ex-info
とex-data
を使用した関数型プログラミング風味の豊かなエラーデータを提供します。
Clojureでのエラー処理の代替方法には、cats
ライブラリのeither
モナドや、core.asyncのチャネルベースのエラー伝搬など、モナディック構造を使用する方法が含まれます。しかし、これらはより複雑で特定のシナリオで使用されます。
歴史的に、プログラミング言語のエラー処理はシンプルなステータス返却から、現代言語のより洗練された例外処理メカニズムに進化してきました。Clojureはシンプルさと関数型プログラミングのタッチを選択し、古いものと新しいものを組み合わせています。
参照
- Clojureの例外処理ガイド: https://clojure.org/guides/exceptions
- より関数型アプローチのための「Cats」ライブラリ: https://github.com/funcool/cats
- 非同期プログラミング用の「Core.async」: https://github.com/clojure/core.async