一旦掌握了典型的 R 错误消息,它们就会非常有用。
尽管如此,我经常发现 R 自己的错误消息并不像我期望的那样提供丰富的信息,所以我通常最终会编写某种定制的错误消息。
现在,我想知道在为特定错误分配唯一错误代码以及附加信息方面是否有一些系统方法(或推荐的最佳实践方法)。
我想我想为错误构建某种哈希表解决方案,其中可以为每个错误存储和检索附加信息。您会使用某种“轻量级”数据库解决方案(例如 SQLite)还是通过存储在某处( )并在需要时检索的简单对象data.frame
或list
对象来解决这个问题?.rdata
家庭作业
老实说,我还没有对它做太多的研究。虽然这里至少有一些东西;-)
包裹记者
我刚刚发现了记者包,并将更详细地检查它。有没有人有使用该软件包或类似软件包的经验?
我自己的方法大纲(部分是伪代码)
myFoo <- function(x, ...) {
tryCatch(
x * 100,
error=function(e) {
record <- retrieveErrorRecord(e) # Does not exist yet
# 'record' would be some sort of list or Ref Class Object
if (!length(record)) {
uid <- generateUid(e) # Does not exist yet
msg <- paste(
"expecting arg 'x' to be of class 'numeric' (was '",
class(x), "')", sep="")
insertErrorRecord( # Does not exist yet
list(
uid=uid,
message=msg,
original=e
)
)
record <- retrieveErrorRecord(e)
}
msg <- c(
"myFoo/error:\n",
paste("* Code: ", record$uid, "\n", sep=""),
paste("* Message: ", record$message, "\n", sep=""),
paste("* Original: ", record$original, "\n", sep="")
)
stop(msg)
}
)
}
这就是消息的样子
require("digest")
x <- "abc"
e <- simpleError("test error")
record <- list(
uid=digest(e),
message=paste("expecting arg 'x' to be of class 'numeric' (was '",
class(x), "')", sep=""),
original=e
)
msg <- c(
"myFoo/error:\n",
paste("* Code: ", record$uid, "\n", sep=""),
paste("* Message: ", record$message, "\n", sep=""),
paste("* Original: ", record$original, "\n", sep="")
)
> stop(msg)
Error: myFoo/error:
* Code: e78e73054b93d2bf682df32845cd064d
* Message: expecting arg 'x' to be of class 'numeric' (was 'character')
* Original: Error: test error