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
.
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
Merci pour les ajouts et l'explication claire – waanders
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