Greetings,
?
Error handling does not seem to work as expected.
When a handler for general conditions is provided in?first?position in?the
handler list it will be called
regardless of what condition has been signalled.
?
See sample code, move? "condition = function(c){...}" to first
position in handler list.
This indicates that the determination of which condition handler is appropriate
does not work like
virtual function dispatch.
?
I also would like to know what happens if some handlers are not provided.
For example if a warning handler is not provided and a warning is signalled does
this invoke a
default handler and how does this handler know which value to return from the
tryCatch block.
?
Thanks,
?
Michael
?
?
?
# Function signals various conditions
#
prejudiced <- function(x){
?
??? cl <- call("prejudiced",x)
??? # throw various conditions with message and information about function call
??? if(x==0) signalCondition( simpleCondition("x=0
encountered",call=cl) )
??? if(x==1) signalCondition( simpleMessage("Do not like 1",call=cl) )
??? if(x==2) signalCondition( simpleWarning("Hate 2",call=cl) )
??? if(x==3) signalCondition( simpleError("Cannot tolerate 3",call=cl)
)
??? return(x)
}
tryCatchTest <- function(x){
???
actual <- tryCatch({
??????????????? # expressions evaluated until condition signalled:
??????????????? -1
??????????????? prejudiced(x)
??????????????? 4? # returned if no condition is signalled
??????????? },
??????????? # condition handlers return new value as result of tryCatch:
??????????? message = function(m){ print(m); 6},
??????????? warning = function(w){ print(w); 7},
??????????? error?? = function(e){ print(e); 8},
??????????? # must be put last otherwise it is called for any condition
??????????? condition = function(c){ print(c); 5},
??????????? finally = { cat("\nCleaned up.") }
??? )
??? # result of tryCatch:
??? expected <- 4
??? if(x==0) expected <- 5
??? if(x==1) expected <- 6
??? if(x==2) expected <- 7
??? if(x==3) expected <- 8
??? cat("\nResult of tryCatch should be ",expected," and is:
",actual)
}