为什么撤防错误不会在rebol中给出错误对象?

时间:2010-11-24 17:24:22

标签: rebol

rebol []

secretAgent: do func[ /local person firstName lastName][
  firstName: "James"
  lastName: "Bond"
  person: make object! [
    whoAreYou: func[][
      print rejoin ["My name is " lastName ", " firstName " " lastName]
    ]
  ]
]

secretAgent/whoAreYou
if (error? (error: try [secretAgent/firstName])) [
  probe disarm error
]

input

返回

My name is Bond, James Bond
** Script Error: Invalid path value: firstName
** Near: secretAgent/firstName

虽然我期望与

相同的结果
probe disarm try [secretAgent/firstName]
input

返回:

My name is Bond, James Bond
make object! [
    code: 311
    type: 'script
    id: 'invalid-path
    arg1: 'firstName
    arg2: none
    arg3: none
    near: [secretAgent/firstName]
    where: none
]

2 个答案:

答案 0 :(得分:9)

啊,这就是为什么R3会降低错误触发方式的一个很好的例子。

在R2中,当出现错误时!值被评估(由解释器处理)它将激活错误处理机制。所以,如果你不是很小心,当你传递错误值(比如传递给函数,将其作为结果返回,或者在你的情况下,在paren表达式中评估它)时,它会触发错误异常处理程序。

回想起来,这个头发触发器是一个糟糕的评估规则。所以,这就是 R3不再以这种方式处理错误的原因。但是,我们无法在R2中更改它。

答案 1 :(得分:5)

尝试没有额外的(括号)

if error? error: try [secretAgent/firstName] [
  probe disarm error
]

REBOL 2错误是头发触发器。你的错误是在冒出一组括号而不是陷入困境时触发的。

在此处查看不同之处:

if error?  error: try [0 / 0]  [print ['bad mold disarm error]]
if error? (error: try [0 / 0]) [print ['bad mold disarm error]]

REBOL 3错误处理略有不同 - 例如,撤防不再需要。