仍然在与R斗争,尤其是错误处理:
如果我使用:
result <- try(sqlSave(ch,df,tablename="tblTest"))
我可以使用:
if (class(result) != "try-error")
检查是否出了问题。没问题。
但如果我将try
与函数结合使用,它就不会像我预期的那样工作:
result <- try(ch<-odbcConnect("TEST"))
为result
提供“-1”,为class(result)
提供“整数”
我应该使用
ch<-odbcConnect("TEST")
if (ch != -1)
并使用geterrmessage()
作为错误消息?
答案 0 :(得分:10)
如果仔细阅读错误消息,您会发现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)。 如果没有错误,则结果类不能为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
个值。