gpt4 book ai didi

r - 如何防止截断 R 中的错​​误消息

转载 作者:行者123 更新时间:2023-12-04 03:56:13 25 4
gpt4 key购买 nike

我正在使用 RJDBC 查询 R 中的数据库。查询是根据从文件中读入的数据构建的。这些查询可能会很长,并且可能包含不存在的列(导致错误)。

下面是一个简化示例,它将文件作为输入,并运行从文件生成的 2 个查询。

table     columndrinks    costdrinks    sugardrinks    volumefood      cost
SELECT column, cost, sugar FROM drinks;
SELECT cost FROM food;

由于这些查询可能会很长,因此数据库中的任何错误通常会在有用信息之前被截断。我目前的错误之一是:

ERROR [2018-05-16 16:53:07] Error processing table data_baseline_biosamples for DAR-2018-00008 original error message: Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ", : Unable to retrieve JDBC result set for SELECT ed.studyid, {very long list of columns} ,ct.nmr_xl_vldl_pl,ct.nmr_xl_



因为数据库错误包括关键信息之前的整个查询,截断删除了解决问题的有值(value)的信息。

在这种情况下,错误消息可能以如下内容结束:

(line 1, Table 'data_biosamples' owned by 'littlefeltfangs' does not contain column 'sample_source'.)



如何记录数据库发送的完整错误消息或以其他方式提取该消息的最后部分?

我在 tryCatch 中捕获错误并使用 futile.logger 将错误传递到日志文件中。截断时的总错误长度为 8219 个字符,其中 8190 个字符似乎来自数据库。

最佳答案

不是RJDBC这会切断错误消息。
?stop :

Errors will be truncated to getOption("warning.length") characters, default 1000.


所以你可以设置选项:
stop(paste(rep(letters, 50L), collapse = ''))
options(warning.length = 2000L)
stop(paste(rep(letters, 50L), collapse = ''))
您会注意到第一条消息中的截断,但不会注意到第二条消息。
对于我自己的帮助函数从 RDJBC 中捕获错误,我使用类似的东西:
result = tryCatch(<some DB operation>, error = identity)
然后在 result$message 上做正则表达式测试各种常见错误并生成更友好的错误消息。
?stop中未提及是 warning.length只能在相当窄的值范围内。为了探索这一点,我运行了以下代码:
old = options('warning.length')
can = vapply(1:16000L, function(ii) {
!is.error(tryCatch(options(warning.length=ii), error=identity))
}, logical(1L))
options(old)

png('~/Desktop/warning_valid.png')
plot(can, las = 1L, ylab = 'Valid option value?',
main = 'Valid option values for `warning.length`',
type = 's', lwd = 3L, log = 'x')
first = which.max(can)
switches = c(first, first + which.min(can[first:length(can)] - 1L))
abline(v = switches, lty = 2L, col = 'red', lwd = 2L)
axis(side = 1L, at = switches, las = 2L, cex = .5)
dev.off()
A plot showing valid values of the 'warning.length' option. the plot starts at 0 (invalid) and rises to 1 (valid) at Index=100, where it stays before dropping back to 0 at around 8172.
我不确定 100 的最小值,但 8172 是 8192 - 20(20 个字符足以包含 [... truncated] )。 Here是 R 源中这些值被硬编码的位置,以及 here是定义8192缓冲区大小的地方。
FWIW,在我自己的错误解析辅助函数(为查询 PrestoDB 构建)中,我有这一行:
core_msg = gsub('.*(Query failed.*)\\)\\s*$', '\\1', result$message)
这是为了迎合来自 PrestoDB 的错误消息,所以你必须自己定制它,但想法是剪掉你的错误消息的那部分,它只是反刍查询本身。
或者,您当然可以拆分 result$message分成小于 8172 的两位字符并分别打印出来。

关于r - 如何防止截断 R 中的错​​误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50387667/

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