2010-11-24 3 views
0
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 

kehrenWarum Unscharf Fehler gibt Fehler Objekt in Rebol nicht?

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

während ich gleiches Ergebnis erwarten wie für

probe disarm try [secretAgent/firstName] 
input 

, die zurückgibt:

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 
] 

Antwort

5

Versuchen ohne die zusätzliche (Klammern)

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

REBOL 2 Fehler sind Haarausfall. Ihr Fehler wurde ausgelöst, wenn Sie einen Klammersatz aufsprudeln und nicht gefangen haben.

Sehen Sie den Unterschied hier:

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

REBOL 3 Fehlerbehandlung ist etwas anders - entwaffnen nicht mehr erforderlich ist, zum Beispiel.

+0

danke, aber das ist seltsam Verhalten als() sollte "neutral" sein. –

+0

Ja die() sollte keinen Unterschied machen. Aber REBOL2 ist nur ein wenig zu empfindlich. REBOL3 macht es richtig: das Extra() macht keinen Unterschied. – Sunanda

+0

() verursachen eine Auswertung, wenn sie innerhalb eines Ausdrucks verwendet werden. deshalb wird der Fehler ausgelöst, da der Fehler nicht unscharf wurde. – moliad

9

Ah, das ist ein gutes Beispiel dafür, warum R3 die Art und Weise, wie Fehler ausgelöst werden, abschwächt.

In R2, wenn ein Fehler! Werte ausgewertet (vom Interpreter verarbeitet), wird der Fehlerbehandlungsmechanismus aktiviert. Also, wenn Sie nicht wirklich vorsichtig sind, wenn Sie den Fehlerwert weitergeben (wie es an eine Funktion übergeben, als Ergebnis zurückgeben oder in Ihrem Fall in einem paren Ausdruck auswerten), wird es den Fehler auslösen Ausnahmehandler erneut.

Rückblickend war dieser Haartrigger eine schlechte Bewertungsregel. Also, deshalb R3 behandelt nicht mehr Fehler auf diese Weise. Aber wir können es in R2 nicht ändern.