错误,中止,断言和失败之间的区别?

时间:2019-09-04 07:45:22

标签: daml

DAML中的errorfailabortassert有什么区别?

1 个答案:

答案 0 :(得分:1)

failabort是同一功能的别名,abort是更常见的用法。它们用于使ActionUpdate之类的Scenario失败,但仍返回适当类型的值。以下情形非常好,因为实际上从未执行过s

t = scenario do
  let
    s : Scenario () = abort "Foo"
  return ()

如果希望ScenarioUpdate的分支导致失败,请使用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 ()