Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

[REBOL] Re: How safe is catch []

From: lmecir:mbox:vol:cz at: 25-Apr-2005 11:20

Anton Reisacher napsal(a):
>How safe is catch? > >I have some rebol applications serving message communication (around 1000 to >2000 messages per day mostly) running for more than half a year on >Windows2000 Server without interruption since the last update of the OS for >security reasons. > >Recently I had to add some message splitting: >one-message --> [message-part-1 message-part-2 message-part-3] > >I used a construct similar to this > >forever [ > until [new-messages-available] > foreach message new-messages [ > catch [ > if not important [throw] > do-some-heavy-message-processing-and data-completion-using-odbc > if some-tests [throw] > message-parts: split-messages message > until [ > catch [ > message: first message-parts > do-more-conversions > if other-tests [throw] > deliver message > emtpy? message-parts: next message-parts > ] > ] > ] > ] >] > >Now I saw two crashes in one day. >I was somehow able to reproduce the crash >"Invalid data type during recycle" >by playing again the history of one to two weeks. But the crash happened >always processing another message. > >As I had seen in the past instable behaviour with constructs like this >foreach ... [ > catch [ > .. > data: any [ > a > b > throw > ] > .. > .. > ] >] > >I replaced the inner catch with statements like this > if not other-tests [ > deliver message > ] >and the crash went away. > >Now I am curious if someone else encountered the same behaviour too? >
hi Anton, I needed a slightly different Catch version than the official one. Try this to see if things go better: Rebol [ Title: "Catch" File: %catch.r Date: 4/Mar/2005/17:12 Author: "Ladislav Mecir" Purpose: { Catches local throw' Ignores non-local throws Works with Parse } ] ; Evaluation of the following global functions is an error return': func [[catch]] [throw make error! [throw not-local]] exit': func [[catch]] [throw make error! [throw not-local]] throw': func [[catch]] [throw make error! [throw not-local]] ; Error definition system/error/throw: make system/error/throw [ not-local: "Global return', exit' or throw' evaluated" ] catch': func [ {Catches a throw' from a block and returns the value.} block [block!] "Block to evaluate" /local throw' result1 result2 result1? ] [ ; "localize" 'throw' in the block set [throw' block] use [throw'] reduce [ reduce ['throw' copy/deep block] ] set throw' func [value [any-type!]] [ error? set/any 'result1 get/any 'value result1?: true make error! "" ] either error? set/any 'result2 try block [ either result1? [return get/any 'result1] [result2] ] [return get/any 'result2] ] comment [ ; Usage: catch' [parse "ssss" [(throw' "OK")]] ] -L