почему ошибка разоружения не дает объект ошибки в реболе? - PullRequest
0 голосов
/ 24 ноября 2010
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 ]

9 голосов
/ 28 мая 2013

Ах, это хороший пример того, почему R3 снижает вероятность возникновения ошибок.

В R2, когда ОШИБКА!Значения оцениваются (обрабатываются интерпретатором), это активирует механизм обработки ошибок.Итак, если вы не очень осторожны, когда вы передаете значение ошибки (например, передаете его в функцию, возвращаете его в результате, или, в вашем случае, оцениваете его внутри выражения paren), оно вызовет ошибкуснова обработчик исключений.

В ретроспективе этот триггер был плохим правилом оценки.Вот почему R3 больше не обрабатывает ошибки таким образом .Но мы не можем изменить его в R2.

5 голосов
/ 24 ноября 2010

Попробуйте без лишних (скобки)

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 обработка ошибок немного отличается - disarm больше не требуется, например.

...