函数和R中的try()

waa*_*ers 15 error-handling r

仍在努力与R,尤其是错误处理:

如果我使用:

result <- try(sqlSave(ch,df,tablename="tblTest"))
Run Code Online (Sandbox Code Playgroud)

我可以用:

if (class(result) != "try-error")
Run Code Online (Sandbox Code Playgroud)

检查是否出了问题.没问题.

但是如果我try与一个函数结合使用它并不像我预期的那样工作:

 result <- try(ch<-odbcConnect("TEST"))
Run Code Online (Sandbox Code Playgroud)

给出"-1"表示result和"整数"表示class(result)

所以我应该使用

ch<-odbcConnect("TEST")
if (ch != -1)
Run Code Online (Sandbox Code Playgroud)

geterrmessage()用于错误消息?

Mar*_*rek 10

如果您仔细阅读错误消息,您可以看到它odbcConnect会给您警告.ODBC驱动程序生成错误,它的try意义不是错误(geterrmessage()也不会起作用).

你可以tryCatch用来处理这个问题,例如:

tryCatch(odbcConnect("TEST"), warning=function(w) print("FAIL!"))
Run Code Online (Sandbox Code Playgroud)

更多解释:
-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)
}
Run Code Online (Sandbox Code Playgroud)

所以你最终没有错误(并带有警告)和C级的整数代码.实际上,当连接成功时返回此代码(但是等于1).当没有错误时,结果类不能try-error.
它不是问题,try而是功能,但具体是这个特定的功能(odbcDriverConnect).

您当然可以在示例中使用此行为

ch <- odbcConnect("TEST")
if (ch != -1)
Run Code Online (Sandbox Code Playgroud)

tryCatch你可以做

tryCatch(ch<-odbcConnect("TEST"), warning=function(w) print("FAIL!"))
Run Code Online (Sandbox Code Playgroud)

ch成功时创建变量,失败时打印消息.
要么

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

它总是创造ch变量,但如果失败则NA有价值.

  • 如果出现错误,您应该编写处理它的函数.所以你应该这样做:`df < - tryCatch(sqlQuery(ch,paste("SELECT*FROM tblTest")),warning = function(w){print("FAIL!(warning)"); return(NA)}, error = function(e){print("FAIL!(error)"); return(NA)})` (2认同)