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

Ant*_*ine 5 racket

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

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

Rya*_*per 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])
Run Code Online (Sandbox Code Playgroud)

失败延续

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

  • (hash-ref ht key)如果ht不包含条目key,则引发错误,但是
  • (hash-ref ht key failure)要么调用failure(如果它是一个过程),要么只返回它(否则)如果ht不包含key
  • (hash-ref not-a-hash-table key failure)提出合同违规例外; 它没有打电话failure