函数和R中的try()

时间:2010-08-09 13:19:22

标签: r error-handling

仍然在与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()作为错误消息?

1 个答案:

答案 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个值。