我习惯于OCaml,我非常依赖 result 类型,以及一个monadic接口来处理我的应用程序中的故障 . OCaml中存在异常但我很少使用它们,除了解决缺少 return 关键字的问题 .
result
return
Racket(特别是打字的球拍)有这样的趋势吗?在Racket应用程序中处理和传播故障的惯用方法是什么?
有几个成语:
例外主要用于错误,但偶尔用于其他类型的“例外”情况 .
(vector-ref "hello" 0) 引发异常,因为字符串不是向量
(vector-ref "hello" 0)
(string-ref "hello" 72) 引发异常,因为索引超出范围如果由于权限而未打开路径,
(string-ref "hello" 72)
(open-output-file "/does/not/exist") 会引发异常
(open-output-file "/does/not/exist")
某些函数返回一个联合,其中类型的行为类似于数据类型变量 . X or false 的结果特别常见 .
X or false
(assoc 'a '((a . 1) (b . 2))) 返回对 (a . 1) ,但是
(assoc 'a '((a . 1) (b . 2)))
(a . 1)
(assoc 'c '((a . 1) (b . 2))) 返回false如果在端口结束之前没有可用字符,
(assoc 'c '((a . 1) (b . 2)))
(read-string 10) 将返回字符串或特殊 eof 对象
(read-string 10)
eof
cond => 语法可用于处理 X or false 结果:
cond =>
(cond [(assoc key alist) => cdr] [else default-value])
某些函数采用额外的(通常是可选的)参数来确定某些类型的故障会发生什么 .
如果 ht 不包含 key 的条目,
ht
key
(hash-ref ht key) 会引发错误,但是
(hash-ref ht key)
(hash-ref ht key failure) 要么调用 failure (如果是程序),要么只返回它(否则)如果 ht 不包含 key
(hash-ref ht key failure)
failure
但 (hash-ref not-a-hash-table key failure) 引发 Contract 违规例外;它不会调用 failure
(hash-ref not-a-hash-table key failure)
1 回答
有几个成语:
例外
例外主要用于错误,但偶尔用于其他类型的“例外”情况 .
(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
结果:失败延续
某些函数采用额外的(通常是可选的)参数来确定某些类型的故障会发生什么 .
如果
ht
不包含key
的条目,(hash-ref ht key)
会引发错误,但是(hash-ref ht key failure)
要么调用failure
(如果是程序),要么只返回它(否则)如果ht
不包含key
但
(hash-ref not-a-hash-table key failure)
引发 Contract 违规例外;它不会调用failure