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

时间:2017-06-08 15:23:10

标签: racket

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

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

1 个答案:

答案 0 :(得分:6)

有一些习语:

例外

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

  • (vector-ref "hello" 0)引发异常,因为字符串不是向量
  • (string-ref "hello" 72)引发异常,因为索引超出范围
  • 如果路径不存在或由于权限无法打开,
  • (open-output-file "/does/not/exist")会引发异常

结果值

某些函数返回一个union,其类型的行为类似于数据类型变量。 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])

失败继续

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

    如果(hash-ref ht key)不包含ht的条目,
  • key会引发错误,但
  • (hash-ref ht key failure)要么调用failure(如果是程序),要么仅在ht不包含key
  • 时返回(否则)
  • 但是(hash-ref not-a-hash-table key failure)会引发合同违规例外;它不会调用failure