我习惯于OCaml,我非常依赖result
类型,以及一个monadic接口来处理我的应用程序中的失败。 OCaml中存在例外情况但我很少使用它们,除了解决缺少return
关键字的问题。
Racket(特别是打字的球拍)有这样的趋势吗?在Racket应用程序中处理和传播故障的惯用方法是什么?
答案 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