我目前正在开展我的第一个关于clojure的重大项目,并且遇到了一个关于编码风格和最“行为式”的做事方式的问题。基本上我有一个我正在编写的函数,它接受一个数据结构和一个模板,该函数将尝试按摩数据结构。模板结构如下所示:
{
:key1 (:string (:opt :param))
:key2 (:int (:opt :param))
:key3 (:obj (:tpl :template-structure))
:key4 (:list (:tpl :template-structure))
}
每个键都是将在给定数据结构中搜索的原子,并且它的值将尝试与模板结构中给出的类型匹配。因此,它会查找:key1
并检查它是否为字符串。返回值是一个映射,其中:key1
指向给定数据结构中的值(该函数可能会根据给定的选项更改值)。
在:obj
的情况下,它接受另一个模板结构,并在该值和模板结构上递归调用自身,并将结果放在返回中。但是,如果出现错误,我希望直接返回错误。
同样对于列表我希望它基本上再次执行该函数的映射,除非我想直接返回错误。
我的问题是处理这些错误的最佳方法是什么?一些简单的异常处理将是最简单的方法,但我觉得它不是最有效的方式。我可以试着通过大量的if语句来保持链条上的错误,但这似乎也不是很运动。有什么简单的我缺少或者这只是一个丑陋的问题吗?
答案 0 :(得分:4)
你可能对schematic感兴趣,它有相似的东西。您可以在tests和implementation中看到它的使用方式。
基本上我定义了一个error
函数,它为正确格式化的数据返回nil,或者描述错误的字符串。使用异常执行此操作会使管道更容易,但会更难获取详细的错误消息,如"[person: [first_name: expected string, got integer]]"
。