R trycatch() 与 err 和 warn 处理程序一起使用,但 Shiny 仍然崩溃?

标签 r try-catch shiny

重现:

#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)(我猜 warnwarning 也是一样的)。


编辑:

我实际上只是尝试了您的代码,对我来说,当我这样做时它有效:

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/

相关文章:

java - 长时间尝试语句

swift - 如何使用 Do-Try-Catch 修复 "Invalid conversion from throwing function of type X to non-throwing function type Y"

Shiny 服务器上的 R Shiny - 如何访问该应用程序?

R biglm 与分类变量

r - 如何使用 ioslides 在 rmarkdown 演示文稿中使图像填充整个幻灯片?

r - 如何为 R 中向量中的每个元素创建一个闭包?

java - 如何从 java 中的 catch block 调用方法?

r - Pheatmap:annotation_colors[[colnames(annotation)[i]]]中的错误:下标越界

r - Shiny 的应用因错误而停止。如何处理此类错误

r - 为什么我的缩放图从 ggplot2 空白中 Shiny