代码之家  ›  专栏  ›  技术社区  ›  zoran119

Haskell库抛出异常背后的想法是什么

  •  10
  • zoran119  · 技术社区  · 6 年前

    为什么图书馆( wreq 404 例如)抛出异常,而不是将结果包装成 Maybe ?

    也许 吧

    1 回复  |  直到 6 年前
        1
  •  15
  •   leftaroundabout    6 年前

    haskeller极力避免抛出 功能 函数应该只在真正的异常情况下抛出异常,也就是说,这种情况永远不会发生,比如用户传递文档明确禁止的某些输入。如果纯函数经常抛出异常,这将是一个大问题,不仅因为类型没有说明应该准备捕获什么,而且 IO 调用函数的代码。即使原则上你能捕捉到异常,也很难预测

    事实上,即使是在。 Wreq.get , 不会从函数中引发异常 .

    Prelude Network.Wreq> get "htt:/p/this-isn't even valid URL syntax" `seq` "Ok"
    "Ok"
    

    它是 木卫一 行动 当你执行它时:

    Prelude Network.Wreq> get "htt:/p/this-isn't even valid URL syntax" >> pure ()
    *** Exception: InvalidUrlException "htt:/p/this-isn't%20even%20valid%20URL%20syntax" "Invalid scheme"
    

    木卫一 洛茨 属于 木卫一 在不同的情况下,操作可能会有非常不同的错误,这些错误可能很难预测,也可能无法预测,例如硬盘崩溃。将每个操作的所有可能错误编目到一个合适的数据类型将是一项重要的工作,处理每一个可能的情况或找出要传递的部分确实相当麻烦。简单地包装每一个 木卫一 行动 Maybe

    这几乎就是为什么异常首先被发明的问题,对于过程语言和Haskell一样适用(或者更确切地说,是过程eDSL) 木卫一 ). 因为和纯函数不同, 木卫一 它的控制流中有一个定义良好的时间序列,如果需要捕获某个特定的异常,您必须在何处执行它也非常清楚。

    木卫一 也许 吧 Either 使可能的错误显式的值,只是这并不总是值得的。