2010-08-09 6 views
13

encore du mal avec R, en particulier avec la gestion des erreurs:Fonctions et essayer() dans la R

Si j'utilise:

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

je peux utiliser:

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

pour vérifier si quelque chose s'est mal passé. Aucun problème.

Mais si j'utilise try en combinaison avec une fonction ne fonctionne pas comme je m'y attendais:

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

donne « -1 » pour result et « entier » pour class(result)

Alors dois-je utiliser

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

et d'utiliser geterrmessage() pour le message d'erreur?

Répondre

8

Si vous lisez attentivement le message d'erreur, vous pouvez voir que odbcConnect vous avertit. Erreur est générée par les pilotes ODBC et il n'est pas erreur dans try ce qui signifie (geterrmessage() ne fonctionnera pas non plus).

Vous pouvez utiliser tryCatch pour gérer cela, .: par exemple

tryCatch(odbcConnect("TEST"), warning=function(w) print("FAIL!")) 

plus d'explications:
-1 est le résultat de odbcDriverConnect fonction. Si vous regardez le code il y a des lignes

stat <- .Call(C_RODBCDriverConnect, as.character(connection), 
     id, as.integer(believeNRows), as.logical(readOnlyOptimize)) 
if (stat < 0L) { 
    warning("ODBC connection failed") 
    return(stat) 
} 

Donc, vous finissez sans erreurs (et avec un avertissement) et avec le code entier de niveau C. En fait, ce code est renvoyé lorsque la connexion est réussie (mais est égal à 1). En l'absence d'erreur, la classe de résultat ne peut pas être try-error.
Ce n'est pas un problème avec try et fonctions mais spécifiques de cette fonction particulière (odbcDriverConnect).

Vous pouvez bien sûr utiliser ce comportement comme dans votre exemple

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

Avec tryCatch vous pourriez faire

tryCatch(ch<-odbcConnect("TEST"), warning=function(w) print("FAIL!")) 

qui crée ch variable lors de réussir et un message d'impression lors d'un échec.
Ou

ch <- tryCatch(odbcConnect("TEST"), warning=function(w) {print("FAIL!");return(NA)}) 

qui crée toujours la variable ch mais en cas d'échec il y a valeur NA.

+0

Mais je ne comprends toujours pas pourquoi class (résultat) donne "integer" avec un appel de fonction et sinon "try-error". Et où puis-je stocker la variable de canal odbcConnect dans votre exemple? – waanders

+0

Merci pour les ajouts et l'explication claire – waanders

+0

Juste une question: Pourquoi ne pas - df <- tryCatch (sqlQuery (ch, coller ("SELECT * FROM tblTest")), avertissement = fonction (w) {print (" FAIL! "); Return (NA)}) - fonctionnent de la même manière? Je ne reçois pas d'avertissement imprimé et "df" contient le message d'erreur pas une valeur "NA" – waanders

Questions connexes