首页 文章

什么是处理Racket故障的惯用方法?

提问于
浏览
5

我习惯于OCaml,我非常依赖 result 类型,以及一个monadic接口来处理我的应用程序中的故障 . OCaml中存在异常但我很少使用它们,除了解决缺少 return 关键字的问题 .

Racket(特别是打字的球拍)有这样的趋势吗?在Racket应用程序中处理和传播故障的惯用方法是什么?

1 回答

  • 6

    有几个成语:

    例外

    例外主要用于错误,但偶尔用于其他类型的“例外”情况 .

    • (vector-ref "hello" 0) 引发异常,因为字符串不是向量

    • (string-ref "hello" 72) 引发异常,因为索引超出范围
      如果由于权限而未打开路径,

    • (open-output-file "/does/not/exist") 会引发异常

    结果值

    某些函数返回一个联合,其中类型的行为类似于数据类型变量 . X or false 的结果特别常见 .

    • (assoc 'a '((a . 1) (b . 2))) 返回对 (a . 1) ,但是

    • (assoc 'c '((a . 1) (b . 2))) 返回false
      如果在端口结束之前没有可用字符,

    • (read-string 10) 将返回字符串或特殊 eof 对象

    cond => 语法可用于处理 X or false 结果:

    (cond [(assoc key alist) => cdr] [else default-value])
    

    失败延续

    某些函数采用额外的(通常是可选的)参数来确定某些类型的故障会发生什么 .

    如果 ht 不包含 key 的条目,

    • (hash-ref ht key) 会引发错误,但是

    • (hash-ref ht key failure) 要么调用 failure (如果是程序),要么只返回它(否则)如果 ht 不包含 key

    • (hash-ref not-a-hash-table key failure) 引发 Contract 违规例外;它不会调用 failure

相关问题