Все еще борется с R, особенно с обработкой ошибок:
Если я использую:
result <- try(sqlSave(ch,df,tablename="tblTest"))
, я могу использовать:
if (class(result) != "try-error")
, чтобы проверить, что-то пошло не так. Нет проблем.
Но если я использую , попробуйте
в сочетании с функцией, она не будет работать так, как я ожидал:
result <- try(ch<-odbcConnect("TEST"))
дает «-1» для результата
и «целое число» для class (result)
Так что мне следует использовать
ch<-odbcConnect("TEST")
if (ch != -1)
и использовать geterrmessage ()
для сообщения об ошибке?
Если внимательно прочитать сообщение об ошибке, то можно увидеть, что odbcConnect
выдает предупреждение. Ошибка генерируется драйверами ODBC и не является ошибкой в try
смысле (geterrmessage()
тоже не сработает).
Вы можете использовать tryCatch
, чтобы справиться с этим, например:
tryCatch(odbcConnect("TEST"), warning=function(w) print("FAIL!"))
Еще немного пояснений:
-1 - это результат работы функции odbcDriverConnect
. Если вы посмотрите на код, то там есть строки
stat <- .Call(C_RODBCDriverConnect, as.character(connection),
id, as.integer(believeNRows), as.logical(readOnlyOptimize))
if (stat < 0L) {
warning("ODBC connection failed")
return(stat)
}
Таким образом, вы заканчиваете без ошибок (и с предупреждением) и с целочисленным кодом с уровня C. На самом деле этот код возвращается и при успешном подключении (но тогда он равен 1). Когда ошибок нет, класс result не может быть try-error
.
Это не проблема try
и функций, а специфика именно этой функции (odbcDriverConnect
).
Вы, конечно, можете использовать это поведение, как в вашем примере
ch <- odbcConnect("TEST")
if (ch != -1)
С tryCatch
вы можете сделать
tryCatch(ch<-odbcConnect("TEST"), warning=function(w) print("FAIL!"))
что создает ch
переменную при успехе и печатает сообщение при неудаче.
Или
ch <- tryCatch(odbcConnect("TEST"), warning=function(w) {print("FAIL!");return(NA)})
которая всегда создает переменную ch
, но в случае неудачи имеет значение NA
.