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
]
答案 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错误处理略有不同 - 例如,撤防不再需要。