2010-08-09 8 views
13

Todavía luchando con R, especialmente con la gestión de errores:Funciones y tratar() en I

si uso:

result <- try(sqlSave(ch,df,tablename="tblTest")) 

que puede utilizar:

if (class(result) != "try-error") 

para comprobar si algo salió mal. No hay problema.

Pero si uso try en combinación con una función que no funciona como esperaba:

result <- try(ch<-odbcConnect("TEST")) 

da "-1" para result y "entero" para class(result)

Así que debo Use

ch<-odbcConnect("TEST") 
if (ch != -1) 

y utilice geterrmessage() para el mensaje de error?

Respuesta

8

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.

+0

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

+0

Gracias por las adiciones y la explicación clara – waanders

+0

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