重现:
#app.R
library(shiny)
library(RODBC)
savefunc <- function() {
conn <- odbcConnect(...) #put in a conn string u know works
df = data.frame(testing=c("testing"))
columnTypes = list(testing="varchar(128)")
tryCatch(
{
sqlSave(conn, dat=df, tablename ="...", #put in a pre-existing tbl
rownames = FALSE, colnames = FALSE, append=TRUE, varTypes=columnTypes)
},
err=function(errorCondition) {
cat("in err handler")
message(errorCondition)
},
warn=function(warningCondition) {
cat("in warn handler")
message(warningCondition)
},
finally={
odbcClose(conn)
}
)
}
server <- function(input, output) {
observeEvent(input$doBtn, {
savefunc()
})
}
ui <- shinyUI(fluidPage(
mainPanel(
actionButton("doBtn", "Do something")
)
))
shinyApp(ui = ui, server = server)
错误没有被捕获...虽然 R 似乎仍在运行(没有崩溃),但当您查看 Shiny 应用程序/用户界面时,您会发现它已经死了。控制台中的错误类似于:
Warning: Unhandled error in observer: unable to append to table xxx
observeEvent(input$doBtn)
(根据上面的例子,你可能会得到一些不同的东西)但关键是错误现在已经以 Shiny 的方式传递给了观察者。有没有办法让 Shiny 的应用程序本身也进行故障转移?或者抑制观察者内部的错误?
最佳答案
我只是有一个非常相似的经历( Uncaught Error ),事实上,只需将 err=function(e)
替换为 error=function(e)
(我猜 warn
和 warning
也是一样的)。
编辑:
我实际上只是尝试了您的代码,对我来说,当我这样做时它有效:
savefunc <- function() {
tryCatch({
conn <- odbcConnect(...)
df = data.frame(testing=c("testing"))
columnTypes = list(testing="varchar(128)")
tryCatch({
sqlSave(conn, dat=df, tablename="...", rownames=FALSE, colnames=FALSE, append=TRUE, varTypes=columnTypes)
}, error=function(e) {
cat(paste("in err handler\n"),e)
}, warning=function(w) {
cat(paste("in warn handler\n"),w)
}, finally={
odbcClose(conn)
})
}, error=function(e) {
cat(paste("in err handler2\n"),e)
}, warning=function(w) {
cat(paste("in warn handler2\n"),w)
})
}
它显然很脏,我不太确定它为什么会起作用。我刚刚摆脱了 message()
调用并封装了两个 trycatch()
。
也许值得一试。
关于R trycatch() 与 err 和 warn 处理程序一起使用,但 Shiny 仍然崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30038676/