gpt4 book ai didi

r - 扩展原始错误消息

转载 作者:行者123 更新时间:2023-12-03 07:54:48 28 4
gpt4 key购买 nike

有没有一种方法可以直接 扩展/增强/覆盖当我没有编写自己的函数的调用失败时(即,来自R的函数和贡献的包)失败时引发的原始错误消息?



请考虑以下引用类:

setRefClass("A", fields=list(x1="character"))

指定正确的值时没有错误:
new("A", x1="Hello World!")

指定错误的值时导致的错误:
> new("A", x1=TRUE)
Error: invalid assignment for reference class field 'x1', should be from class "character" or a subclass (was class "logical")

现在,我想包含有关实际上是“导致问题”的类的信息。

也许看起来像这样:
Error: Field assignment error in class 'A':
Invalid assignment for reference class field 'x1', should be from class "character" or a subclass (was class "logical")

我当前用于实现接近目标的解决方法通常是这样的:
setRefClass("A", 
fields=list(x1="character"),
methods=list(
setField=function(field, value) {
tryCatch(
.self$field(name=field, value=value),
warning=function(cond) {
message(cond)
.self$field(field=field, value=value)
},
error=function(cond) {
stop(paste0("Field assignment error in class '",
class(.self), "'\n"),
"ORIGINAL ERROR:\n", as.character(cond)
)
}
)
}
)
)

首先实例化“空白”对象后
x <- new("A")

尝试通过显式setter方法向字段设置错误值时,这将给我以下错误:
> x$setField(field="x1", value=TRUE)
Error in value[[3L]](cond) : Field assignment error in class 'A'
ORIGINAL ERROR:
Error: invalid assignment for reference class field 'x1', should be from class "character" or a subclass (was class "logical")

我不喜欢它,原因如下:
  • 这是很多代码,仅提供一些额外的信息,并且tryCatch()部分使代码更难阅读。
  • 由于tryCatch()的性质,如果我期望某种“常规”行为(即“即使有警告,但字段值仍设置”),AFAIU也必须将.self$field(field=field, value=value)语句放入warning()函数中。那是重复的代码。
  • 在我看来,通过as.character()强制错误消息(AFAIU是必需的,以便能够通过paste()等添加信息)有时会切断错误消息。
  • 这样,我不得不通过显式setter函数(<obj>$setField(<field>, <value>))设置字段值,而不是通过“内置” initialize函数(new("A", <field>=<value>))设置字段值
  • 最佳答案

  • 事实证明,编写适当的构造函数来完成有用的事情很有用,包括与用户交流期望的参数类型,提供适当的默认值以及检查/强制参数值。
    .A <- setRefClass("A", fields=list(x1="character"))

    A <- function(x1=character(), ...) {
    if (!is.character(x1))
    stop("field 'x1' should be character()")
    .A(x1=x1, ...)
    }
  • 通常使用withCallingHandler并调用重新启动来处理警告
    withCallingHandlers({
    warning("oops")
    1
    }, warning=function(warn) {
    warning("I'm handling: ", conditionMessage(warn), call.=FALSE)
    invokeRestart("muffleWarning")
    })

    带输出
    [1] 1
    Warning message:
    I'm handling: oops

    使用withCallingHandlers(tryCatch())范例来处理警告(带有重新启动)和错误。
  • 使用conditionMessage()访问条件消息。
  • 关于r - 扩展原始错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22263689/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com