在clojure中适当的错误传播

时间:2012-11-09 03:53:25

标签: error-handling clojure

我目前正在开展我的第一个关于clojure的重大项目,并且遇到了一个关于编码风格和最“行为式”的做事方式的问题。基本上我有一个我正在编写的函数,它接受一个数据结构和一个模板,该函数将尝试按摩数据结构。模板结构如下所示:

{
:key1 (:string (:opt :param))
:key2 (:int (:opt :param))
:key3 (:obj (:tpl :template-structure))
:key4 (:list (:tpl :template-structure))
}

每个键都是将在给定数据结构中搜索的原子,并且它的值将尝试与模板结构中给出的类型匹配。因此,它会查找:key1并检查它是否为字符串。返回值是一个映射,其中:key1指向给定数据结构中的值(该函数可能会根据给定的选项更改值)。

:obj的情况下,它接受另一个模板结构,并在该值和模板结构上递归调用自身,并将结果放在返回中。但是,如果出现错误,我希望直接返回错误。

同样对于列表我希望它基本上再次执行该函数的映射,除非我想直接返回错误。

我的问题是处理这些错误的最佳方法是什么?一些简单的异常处理将是最简单的方法,但我觉得它不是最有效的方式。我可以试着通过大量的i​​f语句来保持链条上的错误,但这似乎也不是很运动。有什么简单的我缺少或者这只是一个丑陋的问题吗?

1 个答案:

答案 0 :(得分:4)

你可能对schematic感兴趣,它有相似的东西。您可以在testsimplementation中看到它的使用方式。

基本上我定义了一个error函数,它为正确格式化的数据返回nil,或者描述错误的字符串。使用异常执行此操作会使管道更容易,但会更难获取详细的错误消息,如"[person: [first_name: expected string, got integer]]"