2

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

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

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

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

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

我的问题是处理这些错误的最佳方法是什么?一些简单的异常处理将是最简单的方法,但我觉得它不是最实用的方法。我可以尝试用大量的 if 语句来一直跟踪错误,但这似乎也不是很有趣。有什么简单的我错过了,或者这只是一个丑陋的问题?

4

1 回答 1

4

您可能对原理图感兴趣,它的功能非常相似。您可以看到它在测试实现中的使用方式。

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

于 2012-11-09T04:19:48.947 回答