当前位置: 首页 > 知识库问答 >
问题:

如何忽略/跳过R中执行的异常?[副本]

糜昌胤
2023-03-14

我尝试了在这里和其他地方找到的多个例子,但它总是无法满足我的需要。

我的R脚本只是一个配置验证脚本,它会检查以确保用户的环境设置正确。因此,我想尝试5个不同的步骤,并报告每个步骤的状态,以便用户可以立即修复所有问题。例如,我的第一步测试与数据库的连接,如果失败,我想打印一条消息并继续执行步骤2。但它总是在出错时停止执行,所以我只会遇到失败,然后就再也没有了。

我正在使用RScript从命令行运行脚本。W64上的exe。这是我的基本tryCatch,我用error函数进行了尝试,没有,没有任何区别,它总是在出错时中断。

tryCatch(
    expr = {
       res<- dbGetQuery(con, sql)
       print("SQL query results:")
       print(res)
    }
)

共有2个答案

戚京
2023-03-14

您只是在错误发生时没有处理它。下面是一个reprex,演示如何在错误发生时捕获错误:

function_that_always_fails <- function() stop("I failed")

exception_catcher <- function(e) "Carry on regardless"

tryCatch(expr  = function_that_always_fails())
#> Error in function_that_always_fails(): I failed

tryCatch(expr  = function_that_always_fails(),
         error = exception_catcher)
#> [1] "Carry on regardless"

或者,如果您想像示例中那样按顺序运行一堆测试,您可以使用以下内容:

function_that_sometimes_fails <- function(x)
{
  if(x %% 2 == 0) stop("function ", x, " failed")
  print(paste("test", x, "passed"))
}

exception_catcher <- function(e) print(paste(e$message, "but never mind"))

do_tests <- function() {
  for(i in 1:5)
    tryCatch(expr  = function_that_sometimes_fails(i),
         error = exception_catcher)
}

do_tests()
#> [1] "test 1 passed"
#> [1] "function 2 failed but never mind"
#> [1] "test 3 passed"
#> [1] "function 4 failed but never mind"
#> [1] "test 5 passed"

2017年8月20日由reprex软件包(v0.3.0)创建

韩安顺
2023-03-14

除非你告诉它你想抓什么,否则什么也抓不到。例如,

tryCatch(
    expr = {
       res<- dbGetQuery(con, sql)
       print("SQL query results:")
       print(res)
    },
    error = function(e) NULL
)

出现错误时将返回NULL。没有那条线,它什么也抓不到。

旁注:res的存在不确定。两种情况:

>

  • res以前从未定义过。如果出现错误,res将不存在,并且随之而来的任何代码都将失败并出现错误:未找到对象'res'

    在以前的代码块中定义了res,现在可能没有必要了。但是,如果dbGetQuery失败,则不会重新定义res,因此它仍然存在,但与此查询无关。

    这两种情况都有问题。我推荐如下:

    res <- NULL
    res <- tryCatch({
      dbGetQuery(con, sql)
    }, error = function(e) conditionMessage(e))
    if (is.null(res)) {
      print(paste("oops!", res))
    } else {
      print(res)
    }
    

  •  类似资料:
    • 问题内容: 我有以下代码: 我想执行:即使(上面的行)抛出异常。除了: 我连续有很多test.setSomething,它们都可能引发异常。如果他们这样做,我只想跳过这一行,移至下一行。 为了澄清起见,我不在乎它是否引发异常,并且我无法编辑引发此异常的代码的源代码。 这是我不关心例外的情况(请不要使用通用量化的语句,例如“您永远不要忽略异常”)。我正在设置某些对象的值。当我向用户提供值时,无论如何

    • const SKIP_NONE = 0x00; // 不忽略任何单元格、行 const SKIP_EMPTY_ROW = 0x01; // 忽略空行 const SKIP_EMPTY_CELLS = 0x02; // 忽略空单元格(肉眼观察单元格内无数据,并不代表单元格未定义、未使用) const SKIP_EMPTY_VALUE = 0X100; // 忽略单元格空数据

    • 问题内容: 当你只想执行但不处理异常时,如何在Python中进行呢? 以下是正确的方法吗? 问题答案: 要么 所不同的是,第一个也将赶上KeyboardInterrupt,SystemExit和类似的东西,这是直接来源于,没有

    • 我有一个带有以下方法的TestNG类。 我想实现的是:Test2、Test3和Test 4依赖于Test1。所以只有当Test1通过时,我才需要继续。 Test5依赖于Test2、Test3和Test4。但是我可以跳过任何测试(即Test2、Test3或Test4),并且如果其他测试没有失败,我仍然希望继续执行Test5。 我怎样才能做到这一点。

    • 我正在用Python编写一个自定义备份脚本。有时mkdir函数或print函数或任何函数由于各种原因而失败。这样的异常会使整个脚本停止,并在中途停止备份,这是非常令人沮丧的。到目前为止,我已经通过添加try:...except:...语句并正确管理这些异常来管理这些问题。但是,有一天,某个其他语句或函数也可能因为尚未触发的其他原因而引发异常。 有没有一种方法告诉脚本继续进行?是否相当于在try:.

    • 问题内容: 我的代码中有一个try … except块,当抛出异常时。我真的只想继续编写代码,因为在这种情况下,所有内容仍然可以正常运行。问题是,如果您将except:块保留为空或不执行任何操作,则会出现语法错误。我不能使用continue,因为它不在循环中。我可以使用一个关键字来告诉代码继续运行吗? 问题答案: except Exception: pass 适用于pass语句的Python文档