2012-06-23 4 views
7

Когда я использую tryCatch, я могу определить обработчик ошибок и использовать conditionCall для определения вызова, вызвавшего ошибку. Например,Получить вызов ошибок на верхнем уровне?

tryCatch(
    eval(parse(text="prnit('Hello')")), 
    error=function(e) { 
     cl <- conditionCall(e) 
     #... 
    }) 

Могу ли я получить плохой вызов в строке R? До сих пор я нашел только это решение:

> err_hdl <- function() { 
    file1 <- tempfile("Rrawhist") 
    savehistory(file1) 
    rawhist <- readLines(file1) 
    unlink(file1) 

    cat("Error : ", tail(rawhist,1), "\n") 
    return(TRUE)  
} 
> options(error=err_hdl) 
> prnit("Hello") 

, но я считаю, что должен быть более простой способ ..

Любой намек оценил!

Я потушил щедрость. Первый ответ, который реализует поведение функции err_hdl выше, без ввода ввода/вывода, независимого от платформы, будет принят.

Редактировать - приведенный выше код, похоже, работает только на окнах. Я ищу вход, который поднял ошибку.

+0

В первом примере ошибки не существует. – kohske

+0

В первом примере вы имели в виду нечто большее, не так ли? 'tryCatch ( eval (parse (text = prnit ('Hello'))), error = function (e) {conditionCall (e)})' –

+0

@Josh O'Brien Да, вы правы. Изменил вопрос. –

ответ

2

Похоже, что dump.frames может не сообщать файл, а скорее объекту в .GlobalEnv. Тем не менее, я не тестировал его ни на чем, кроме Mac. Будет ли следующая помощь?

err_hdl2 <- function() { 
    dump.frames("theErr", to.file = FALSE) 
    cat("What happened?\n", attr(theErr,"error.message"), "\nOh.\n") 
} 
options(error = err_hdl2) 

> prnit(dt) 
Error: could not find function "prnit" 
What happened? 
Error: could not find function "prnit" 

Oh. 

Там может быть недостаток создания объекта theErr в глобальной среде, я полагаю.

> theErr 
$`function() 
{ 
    dump.frames("theErr", to.file = FALSE) 
    cat("What` 
<environment: 0x1030fe140> 

attr(,"error.message") 
[1] "Error: could not find function \"prnit\"\n" 
attr(,"class") 
[1] "dump.frames" 
+0

Спасибо за подсказку 'dump.frames', это новая функция для меня. Могу ли я получить вход, вызвавший ошибку, т. Е. В примере ввод 'prnit (dt)'? –

+0

@ KarstenW., Я не уверен, что понимаю, что вы подразумеваете под «добраться до». Что бы вы хотели сделать с 'prnit (dt)'? – BenBarnes

+0

Ах, это сообщение об ошибке возвращает функцию, которую не удалось найти, а не полную строку кода, которая ее создала? – BenBarnes

Смежные вопросы