Si leyó detenidamente el mensaje de error, puede ver que odbcConnect
le advierte. El error es generado por los controladores ODBC y no es un error en try
, lo que significa que (geterrmessage()
tampoco funcionará).
Usted podría utilizar tryCatch
para manejar esto, por ejemplo .:
tryCatch(odbcConnect("TEST"), warning=function(w) print("FAIL!"))
Un poco más de explicación:
-1 es el resultado de odbcDriverConnect
función. Si nos fijamos en el código hay líneas
stat <- .Call(C_RODBCDriverConnect, as.character(connection),
id, as.integer(believeNRows), as.logical(readOnlyOptimize))
if (stat < 0L) {
warning("ODBC connection failed")
return(stat)
}
Así que terminan sin errores (y con una advertencia) y con el código de número entero de C-nivel. En realidad, este código se devuelve cuando la conexión también tiene éxito (pero luego es igual a 1). Cuando no hay errores, la clase de resultado no puede ser try-error
.
No es problema con try
y funciones específicas de esta función en particular (odbcDriverConnect
).
Se puede usar, por supuesto, este comportamiento como en su ejemplo
ch <- odbcConnect("TEST")
if (ch != -1)
Con tryCatch
que podría hacer
tryCatch(ch<-odbcConnect("TEST"), warning=function(w) print("FAIL!"))
que crea ch
variable cuando el éxito y el mensaje de impresión cuando fracasado.
O
ch <- tryCatch(odbcConnect("TEST"), warning=function(w) {print("FAIL!");return(NA)})
que siempre crea ch
variable, pero en caso de fallo existe NA
valor.
Pero aún no entiendo por qué clase (resultado) da "entero" con una llamada a función y de lo contrario "prueba-error". ¿Y dónde guardo la variable de canal de odbcConnect en su ejemplo? – waanders
Gracias por las adiciones y la explicación clara – waanders
Solo una pregunta: ¿Por qué no? - df <- tryCatch (sqlQuery (ch, paste ("SELECT * FROM tblTest")), warning = function (w) {print (" FAIL! "); Return (NA)}) - ¿funcionan igual? No aparece una advertencia impresa y "df" contiene el mensaje de error no un valor "NA" – waanders