R rmongodb try() не перехватывает ошибку, потенциально вызванную неверными данными

Я использую R и rmongodb для извлечения данных из базы данных MongoDB NoSQL. Я положил в try() логика ловить проблемы возникают из-за плохих данных. Большую часть времени, try() поймает ошибку и пропустит плохой объект данных. Время от времени, хотя, это "не в состоянии" поймать это, и моя программа останавливается. Ниже приведен код, который иногда работает, но не может попасть в if(inherits(...)) иногда. Я положил в чеки, чтобы убедиться, iter1 действителен (насколько я знаю) до вызова mongo.son.iterator.value() функция. На самом деле я использовал try() на звонки, как показано ниже во всей программе. Я пытался tryCatch раньше, но я думаю, что результат был таким же. Любая помощь высоко ценится!

v2 <- try(mongo.bson.iterator.value(iter1)) 

if(inherits(v2, "try-error")) {
    cat("mongo.bson.iterator.VALUE(iter1) ERROR ^^^^^^ , next!")
    Sys.sleep(10)
    next;
}

Выход:

ItemName =  VH013269
before value(iter1)
 type of iter1:  integer
 *** caught segfault ***
address 0x7402cd5, cause 'memory not mapped'
Traceback:
 1: .Call(".mongo.bson.iterator.value", iter)
 2: mongo.bson.iterator.value(iter1)
 3: doTryCatch(return(expr), name, parentenv, handler)
 4: tryCatchOne(expr, names, parentenv, handlers[[1L]])
 5: tryCatchList(expr, classes, parentenv, handlers)
 6: tryCatch(expr, error = function (e) {
        call <- conditionCall(e)
        if (!is.null(call)) {
            if (identical(call[[1L]], quote(doTryCatch))) 
                call <- sys.call(-4L)
            dcall <- deparse(call)[1L]
            prefix <- paste("Error in", dcall, ": ")
            LONG <- 75L
            msg <- conditionMessage(e)
            sm <- strsplit(msg, "\n")[[1L]]
            w <- 14L + nchar(dcall, type = "w") + nchar(sm[1L], type = "w")
            if (is.na(w)) 
                w <- 14L + nchar(dcall, type = "b") + nchar(sm[1L], type = "b")
            if (w > LONG) 
                prefix <- paste0(prefix, "\n  ")
        }
        else prefix <- "Error : "
        msg <- paste0(prefix, conditionMessage(e), "\n")
        .Internal(seterrmessage(msg[1L]))
        if (!silent && identical(getOption("show.error.messages"), 
            TRUE)) {
            cat(msg, file = stderr())
            .Internal(printDeferredWarnings())
        }
        invisible(structure(msg, class = "try-error", condition = e))
    })
 7: try(mongo.bson.iterator.value(iter1))
 8: eval(expr, envir, enclos)
 9: eval(ei, envir)
10: withVisible(eval(ei, envir))
11: source("parcc_mci_v5.R")
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection:

1 ответ

try может ловить только ошибки на уровне R. Segfault вы видите, потому что .mongo.bson.iterator.value Функция C/C++ обращается к памяти, она не должна быть.

Вы должны сообщить об этом сопровождающему пакета с воспроизводимым примером, если это возможно.

Другие вопросы по тегам