【问题标题】:How do I know where in my Haskell Program an Exception can be Thrown?我怎么知道在我的 Haskell 程序中哪里可以抛出异常?
【发布时间】:2018-03-17 23:48:15
【问题描述】:

我正在处理一个 1-10k 行的个人 Haskell 项目,并且我正在使用各种 IO 库,例如 Network.HTTP.Conduit 在由 Pipes.Concurrent 生成的工作人员中。

我刚刚意识到其中一些 IO 库在极端情况下会引发异常。

GHC 有什么方法可以在编译时向我发出有关未捕获异常的警告?找出库可以抛出的异常的最佳方法是什么?

谢谢!

【问题讨论】:

  • 您基本上可以让任何函数在评估其中一个输入时抛出异常,这会使整个任务变得更加模糊。无法获得完美的工具并不意味着无法创建可以警告许多异常的有用工具,但我不知道有任何此类工具。 Liquid Haskell 的整体检查器部分做到了这一点,但与其他很多东西捆绑在一起,我不确定你能否有效地利用它。
  • 感谢您的想法 - 如果没有其他人在做,我可能会自己做。你知道为什么这在类型系统中不像在 Java 中那样吗?
  • 在 Java 中,任何东西都可以抛出 RuntimeException,而这并没有记录在类型中。它归结为社区标准。我对查找违反社区标准的库(在 Haskell 中是“当你可以简单地传回结构化数据时不要扔”)的建议是避免使用它们。
  • @FriedBrice 我之前曾与图书馆作者争论过,但没有成功。事实证明,人们比纯 API 更看重易于开发。使用异常而不是 sum 类型是主要库(如 cryptonite)以及低级库(如网络)的规范。
  • @ThomasMDuBuisson 这确实是一种可悲的状况。它支持谁的“易于开发”?当然不是图书馆的消费者。

标签: http haskell exception type-safety haskell-pipes


【解决方案1】:

只是回答我自己在 2018 年的问题。希望随着时间的推移会有所改善。

在编译时,无法知道 Haskell 程序的哪些部分会引发异常。一些库选择返回 Either/Maybe 单子以安全地处理边缘情况,而其他库选择抛出异常。

就我个人而言,我认为这会降低 Haskell 在生产环境中运行的吸引力,尤其是因为这些异常很少有堆栈跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多