클로저의 관용구 오류
에러 처리와 Clojure의 유연성
스레딩에서의 에러 처리
Clojure에서 스레딩을 사용할 때, nil
대신 :failure
키를 포함하는 맵이 있을 경우 에러를 처리합니다. 결과를 관리하기 위해 if-let
과 유사한 구조를 사용하는 것이 유용합니다. 중급 수준의 Clojure 개발자가 직접 구현하기 어렵지 않으며, 구현 세부사항은 선호도에 따라 다를 수 있습니다. 간단한 버전은 gist 링크에 있으며, 더 복잡한 접근 방식은 thread-until을 참고하세요.
파이프라인에서의 활용
이 접근 방식은 대량의 항목을 처리하는 파이프라인을 구축할 때 유용합니다. 예를 들어, 30,000개의 항목 중 22,051번 항목에 오류가 발생해도 전체 처리를 중단하지 않고, 에러 맵을 통해 오류를 전달할 수 있습니다. 이는 nil
을 반환하는 것보다 더 유용한 방법입니다.
Sean Corfield의 에러 처리 방법
Sean Corfield는 다음과 같은 방법으로 에러를 처리합니다:
- 예상치 못한 오류가 발생했을 때는 예외를 던집니다.
- 예상 가능한 오류는
nil
또는{:ok false :message "..."}
값을 반환합니다. 성공 시에는{:ok true :value ...}
값을 반환합니다.
Clojure의 유형 시스템과 에러 처리
Clojure는 Java의 엄격한 유형 시스템에 얽매이지 않기 때문에 다양한 형태로 값을 반환할 수 있습니다. Java에서는 단일 유형의 결과만 반환할 수 있어 예외를 통해 다른 결과를 전달하지만, Clojure에서는 데이터 맵을 사용하여 유연하게 오류를 처리할 수 있습니다.
에러 맵의 구조화
에러 맵을 무분별하게 사용하는 대신 표준화된 구조로 만드는 것이 좋습니다. Cognitect의 anomalies는 ::anom/category
키를 사용하여 오류를 분류하는 최소한의 접근 방식입니다. Exoscale의 ex는 멀티메서드와 유사한 계층 구조를 통해 예외를 관리합니다. 이러한 표준화는 동적 언어를 사용할 때 자연스럽고 효율적입니다.
흐르는 에러 처리 라이브러리
에러 맵을 더 구체적으로 다루기 위해 다양한 라이브러리가 존재합니다. 예를 들어, Ivan Grishaev의 pact, fmnoise의 flow, Adam Bard의 failjure 등이 있습니다. 이러한 라이브러리들은 "Either Monad-ness" 스펙트럼을 따라 다양한 에러 처리 방식을 제공합니다.
커뮤니티와 커스텀 에러 처리
Clojure 커뮤니티는 사용자 정의 에러 처리를 쉽게 할 수 있도록 다양한 도구와 라이브러리를 공유합니다. 이는 동적 언어의 특성과 잘 맞으며, 개발자가 자신의 필요에 맞게 에러 처리를 확장할 수 있게 합니다.
참고 자료
- thread-until by Reefersleep
- Cognitect’s anomalies
- pact by Ivan Grishaev