If you read closely error message you could see that odbcConnect
gives you warning. Error is generated by ODBC drivers and it isn't error in try
meaning (geterrmessage()
won't work either).
You could use tryCatch
to handle this, e.g.:
tryCatch(odbcConnect("TEST"), warning=function(w) print("FAIL!"))
Some more explanation:
-1 is a result of odbcDriverConnect
function. If you look at the code there are lines
stat <- .Call(C_RODBCDriverConnect, as.character(connection),
id, as.integer(believeNRows), as.logical(readOnlyOptimize))
if (stat < 0L) {
warning("ODBC connection failed")
return(stat)
}
So you end without errors (and with a warning) and with integer code from C-level. Actually this code is returned when connection is succeed too (but then is equal 1). When there is no errors then result class can't be try-error
.
It is not problem with try
and functions but specific of this particular function (odbcDriverConnect
).
You could of course use this behaviour as in your example
ch <- odbcConnect("TEST")
if (ch != -1)
With tryCatch
you could do
tryCatch(ch<-odbcConnect("TEST"), warning=function(w) print("FAIL!"))
which creates ch
variable when succeed and print message when failed.
Or
ch <- tryCatch(odbcConnect("TEST"), warning=function(w) {print("FAIL!");return(NA)})
which always creates ch
variable but in case of failure there is NA
value.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…