Reputation: 177
I stumbled on this and just wanted to make sure this isn't a glitch in Rebol's design. I have the following code which seems to successfully catch all program errors in the VID environment.
view layout [
across
label "Rebol Command:"
f: field [
do f/text
focus f
] return
button "Error 1" [
print this-is-an-error-1
]
button "Error 2" [
print this-is-error-2
]
time-sensor: sensor 0x0 rate 1000
feel [
engage: func [face action event] [
if action = 'time [
time-sensor/rate: none
show face
if error? err: try [
do-events
true ; to make the try happy
][
the-error: disarm :err
? the-error
; reset sensor to fire again
time-sensor/rate: 1000
show face
focus f
]
]
]
]
do [
focus f
]
]
Upvotes: 3
Views: 74
Reputation: 3718
This isn't a glitch—do-events
is indeed the dispatcher that will run until an error occurs. I'd suggest decoupling the error handler from the layout model itself though:
view/new layout [
across
label "Rebol Command:"
f: field [
do f/text
focus f
] return
button "Error 1" [
print this-is-an-error-1
]
button "Error 2" [
print this-is-error-2
]
do [
focus f
]
]
forever [
either error? err: try [
do-events
][
the-error: disarm :err
? the-error
focus f
][
break
]
]
Upvotes: 3