【发布时间】:2023-03-25 10:23:01
【问题描述】:
我正在尝试测试对象是否是错误的结果。该用例主要是通过产生错误的foreach() 循环产生的(尽管对于测试,将simpleError() 分配给变量似乎就足够了),我对如何识别何时发生感到困惑:我如何测试给定的对象实际上是一个错误?一旦我确定这是一个错误,除了一条消息,我还能提取什么?也许我遗漏了 R 的错误处理工具,因为似乎有必要编写一个错误对象测试函数de novo。
这里有两个示例,一个使用foreach,将.errorhandling 参数设置为pass。我已经开始将其用作大规模或无人值守处理的默认设置,以防数据切片出现异常。这种异常很少见,不值得让整个 for 循环崩溃(特别是如果异常发生在最后,这似乎是我的 murphysListSortingAlgorithm() 的默认行为;-))。相反,事后检测是需要的。
library(foreach)
library(doMC)
registerDoMC(2)
results = foreach(ix = 1:10, .errorhandling = "pass") %dopar%{
if(ix == 6){
stop("Perfect")
}
if(ix == 7){
stop("LuckyPrime")
} else {
return(ix)
}
}
为简单起见,这是一个非常简单的错误(根据定义):
a = simpleError("SNAFU")
虽然似乎没有像is.error() 这样的命令,而像typeof() 和mode() 这样的命令似乎毫无意义,但我发现最好的方法是使用class() 或attributes(),这给出指示错误的属性。如何以保证确定我有错误并完全处理该错误的方式使用这些?例如a$message 返回SNAFU,但a$call 是NULL。我是否应该期望能够从例如res[[6]]$call 中提取任何有用的信息?
注意 1:如果没有多核功能来重现第一个示例,我应该指出 results[[6]] 与 simpleError("Perfect") 不同:
> b = simpleError("Perfect")
> identical(results[[6]], b)
[1] FALSE
> results[[6]]
<simpleError in eval(expr, envir, enclos): Perfect>
> b
<simpleError: Perfect>
这说明了为什么我不能(非常天真地)测试列表元素是否是香草simpleError。
注意 2。我知道 try 和 tryCatch,并在某些情况下使用它们。但是,我不完全确定如何使用它们对foreach 循环的输出进行后处理。例如,第一个示例中的 results 对象:在我看来,使用 tryCatch 包装器处理其元素没有意义。对于操作的 RHS,即foreach() 循环,我也不确定tryCatch 是否会按照我的意愿行事。我可以使用它来捕获错误,但我想我需要获取消息并在此时插入处理。我看到两个问题:每个循环都需要用tryCatch() 包装,否定.errorhandling 参数的一部分,并且我仍然无法稍后处理results 对象。如果这是进行此处理的唯一方法,那么它就是解决方案,但这意味着无法以与许多其他 R 对象(例如矩阵、向量、数据帧等)类似的方式识别和处理错误。
更新 1。我在 foreach 循环中添加了一个额外的停止触发器,以提供两个不同的消息来识别和解析,以防万一这有帮助。
更新 2。我选择 Richie Cotton 的答案。这似乎是对我应该寻找的最完整的解释,尽管完整的实现需要其他几位代码(以及最新版本的 R)。最重要的是,他指出我们需要牢记两种类型的错误,这对于彻底彻底尤为重要。也可以看看别人的cmet和答案,以充分开发自己的is.error()测试功能;在查找结果列表中的错误时,我给出的答案可能是一个有用的开始,Richie 的代码是测试函数的一个很好的起点。
【问题讨论】:
-
你试过
try和/或tryCatch吗? -
@HongOoi 我在其他情况下使用过这些,但我不清楚如何使用它们来检测和解析错误:假设我有很多不是错误的值 - 什么我会吗?不过,这是一个有趣的途径,我会更新这个问题。
-
我也很困惑为什么
tryCatch在这里不起作用。我不一定会将错误视为对象.... -
一开始有
condition。和condition生BlueScreenOfDeath,与motherOfAllErrors和生error。error在干涸的地球上流浪多年,直到遇见simpleton,然后他们一起生了simpleError。生活是为了conditions。 -
@gsk3 我们有
fortunes()的候选人。 :)
标签: r error-handling