Это не RJDBC
, которое обрезает сообщение об ошибке.
См. ?stop
:
Ошибки будут усечены до getOption("warning.length")
символов, по умолчанию 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
может быть только в довольно узком диапазоне значений. Чтобы изучить это, я запустил следующий код:
can = logical(16000L)
for (ii in seq_along(can)) {
res = tryCatch(options(warning.length = ii),
error = identity)
if (inherits(res, 'error')) {
can[ii] = FALSE
} else can[ii] = TRUE
}
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()
Ударяет меня, откуда взялись эти числа (100 и 8172), они кажутся довольно произвольными (8196 - ближайшая степень 2). Здесь - это место в источнике R, где эти значения жестко запрограммированы. Я спросил об этом в r-devel
; Я обновлю этот пост соответственно.
FWIW, в моей собственной вспомогательной функции синтаксического анализа ошибок (созданной для запросов к PrestoDB) у меня есть эта строка:
core_msg = gsub('.*(Query failed.*)\\)\\s*$', '\\1', result$message)
Это относится к сообщениям об ошибках, которые приходят из PrestoDB, поэтому вам придется настроить его самостоятельно, но идея состоит в том, чтобы вырезать ту часть вашего сообщения об ошибке, которая просто отрыгивает сам запрос.
В качестве альтернативы, конечно, вы можете разбить result$message
на два бита, длина которых не превышает 8172
символов, и распечатать их отдельно.