【问题标题】:Proper error propagation in clojureclojure 中的正确错误传播
【发布时间】:2012-11-09 03:53:25
【问题描述】:

我目前正在处理我的第一个 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 语句来一直跟踪错误,但这似乎也不是很有趣。是我遗漏了什么简单的东西还是这只是一个丑陋的问题?

【问题讨论】:

    标签: error-handling clojure


    【解决方案1】:

    您可能对schematic 感兴趣,它的功能非常相似。您可以在testsimplementation 中看到它是如何使用的。

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

    【讨论】:

    • 我想我可以做这样的事情,我不知道 defmulti/method,这会让事情变得更干净!
    • 只是把类似的东西放在一起,现在看来我不必了。谢谢艾伦!
    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2015-09-10
    • 2015-04-06
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多