【问题标题】:Stacktrace and error monads in ClojureClojure 中的 Stacktrace 和错误单子
【发布时间】:2015-06-13 15:34:09
【问题描述】:

我不确定error handling with monads 是否被认为是 Clojure 的最佳实践,但它似乎很受欢迎(但是,我仍然看到很多例外情况)。 Monads 似乎是更实用的错误处理方法。但是,我在使用错误单子时缺少堆栈跟踪。有没有办法在使用 monads 时获取堆栈跟踪?或者这里有什么替代方案?

【问题讨论】:

  • 当你使用 monad 时,你不会有异常。当您没有异常时,您将不会有堆栈跟踪。但是,与堆栈跟踪相比,您可能可以做一些有限的事情:stackoverflow.com/questions/30812123/…
  • 如果 monads 被认为是错误处理的好习惯,我希望有人已经为此目的提供了一个很好的库,这使得这很容易。有谁知道这样的事情吗?

标签: error-handling clojure monads stack-trace


【解决方案1】:

正如 muhuk 所说,您会使用 monad 来避免获取堆栈跟踪。

我在回复another SO recently 时发现一篇与您链接的文章相关的文章是http://overwatering.org/blog/2013/12/clojures-thread-for-monads

它构建了一个m-> 线程monad,并根据error monads 文章中的工作给出了使用它生成fail-> monad 的示例。它允许您在执行期间有效地返回不同的错误类型。

【讨论】:

  • 感谢您提供更多上下文。但是,这并不能回答我的问题。我不明白我为什么要避免一些我认为有用的东西。在调查问题时,堆栈跟踪对我有很大帮助。使用 monads 我只看到错误响应,但我错过了更多与错误相关的上下文,我在堆栈跟踪中清楚地看到了这些上下文。在生产中运行软件时,我需要能够跟踪错误并重现它。也许错误单子功能更强大,但没有良好的跟踪支持,我认为它们不是很实用。
  • 可能你可以挂钩到失败单子并打印堆栈跟踪以查找失败的东西。例如,在 error-m monad 中,使用您自己的代码在 (if (has-failed? m) ... 周围添加一个块以打印出堆栈等。这篇文章确实说例外是为了“绕过其余的 monadic 行为”,所以我希望是真的仍然会抛出异常,这不是您所看到的吗?如果某事因已知错误而失败(例如未知用户、未找到资源),为什么需要堆栈跟踪?这对我来说是错误单子的好处,因为你仍然有错误的上下文。
【解决方案2】:

可以通过在任何地方说(Exception. "msg") 来生成堆栈跟踪。我一直在研究Promenade(参见documentation),它可以将异常和错误值结合起来。如果这听起来像是一个潜在的解决方案,您应该看看。

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多