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

Reb*_*ial 0 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
Run Code Online (Sandbox Code Playgroud)

回报

My name is Bond, James Bond
** Script Error: Invalid path value: firstName
** Near: secretAgent/firstName
Run Code Online (Sandbox Code Playgroud)

而我期望同样的结果

probe disarm try [secretAgent/firstName]
input
Run Code Online (Sandbox Code Playgroud)

返回:

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
]
Run Code Online (Sandbox Code Playgroud)

reb*_*bol 9

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

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

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


小智 5

尝试没有额外的(括号)

if error? error: try [secretAgent/firstName] [
  probe disarm error
]
Run Code Online (Sandbox Code Playgroud)

REBOL 2错误是头发触发器.你的错误是在冒出一组括号而不是被困的情况下触发的.

看到这里的区别:

if error?  error: try [0 / 0]  [print ['bad mold disarm error]]
if error? (error: try [0 / 0]) [print ['bad mold disarm error]]
Run Code Online (Sandbox Code Playgroud)

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