DAML中的error
,fail
,abort
和assert
有什么区别?
答案 0 :(得分:1)
fail
和abort
是同一功能的别名,abort
是更常见的用法。它们用于使Action
和Update
之类的Scenario
失败,但仍返回适当类型的值。以下情形非常好,因为实际上从未执行过s
:
t = scenario do
let
s : Scenario () = abort "Foo"
return ()
如果希望Scenario
或Update
的分支导致失败,请使用abort
。例如,以下Scenario
成功或失败取决于abortScenario
的值:
t2 = scenario do
let abortScenario = True
if abortScenario
then abort "Scenario was aborted"
else return ()
assert
只是abort
的包装:
-- | Check whether a condition is true. If it's not, abort the transaction.
assert : CanAbort m => Bool -> m ()
assert = assertMsg "Assertion failed"
-- | Check whether a condition is true. If it's not, abort the transaction
-- with a message.
assertMsg : CanAbort m => Text -> Bool -> m ()
assertMsg msg b = if b then return () else abort msg
使用abortMsg
几乎总是更好,因为您可以提供翔实的错误消息。
error
用于定义部分功能。它不返回值,而是使解释器立即退出并显示给定的错误消息。例如
divide : Int -> Int -> Int
divide x y
| y == 0 = error "Division by Zero!"
| otherwise = x / y
DAML急切执行,因此您在使用error
时必须非常小心。即使未使用e
,以下情况也会失败。
s = scenario do
let
e = divide 1 0
return ()