Krijgt u bellen over fouten op het hoogste niveau?

Wanneer ik tryCatch gebruik, kan ik een foutverwerker definiëren en conditionCall gebruiken om de aanroep te bepalen die de fout heeft veroorzaakt. Bijvoorbeeld,

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

Kan ik de slechte oproep op de R-prompt krijgen? Tot nu toe vond ik alleen deze oplossing:

> 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")

maar ik geloof dat er een meer rechtlijnige manier moet zijn ..

Elke hint gewaardeerd!

Ik stak een beloning uit. Het eerste antwoord dat het gedrag van de functie err_hdl hierboven implementeert zonder bestands-I/O dat platformonafhankelijk is, wordt geaccepteerd.

Bewerken - de bovenstaande code lijkt alleen te werken op vensters. Ik ben op zoek naar de input die de fout heeft veroorzaakt.

7
@Josh O'Brien Ja, je hebt gelijk. De vraag is gewijzigd.
toegevoegd de auteur Karsten W., de bron
@kohske het probleem is dat ik tryCatch niet kan gebruiken voor opdrachten die ik in de R-console invoeg. Ik ben op zoek naar een aangepast foutopsporingsmechanisme voor de interactieve sessie.
toegevoegd de auteur Karsten W., de bron
FWIW, met betrekking tot uw bewerking moet de err_hdl -functie platformonafhankelijk zijn, aangezien de eerste 4 regels van uw err_hdl -functie dezelfde zijn als de eerste 4 regels in de -geschiedenis functie.
toegevoegd de auteur GSee, de bron
@BenBarnes Oh. mensen gebruiken de GUI ?! ;-) Ik heb de GUI geprobeerd en ik zie dat history() helemaal niet lijkt te werken !!! Ik zal de documenten opnieuw doornemen, maar dat lijkt me zeker een kever.
toegevoegd de auteur GSee, de bron
Ik vermoed dat geschiedenis net anders is voor R.app. cran.r-project.org/bin/macosx/RMacOSX- faq.html # Geschiedenis
toegevoegd de auteur GSee, de bron
toegevoegd de auteur GSee, de bron
In het eerste voorbeeld bedoelde je zoiets dergelijks, toch? tryCatch (eval (parseren (text = prnit ('Hello'))), error = function (e) {conditionCall (e)})
toegevoegd de auteur Josh O'Brien, de bron
Er is geen fout in het eerste voorbeeld.
toegevoegd de auteur kohske, de bron
@GZie, op mijn Mac, geschiedenis , als err_hdl hierboven, lijkt alleen iets nuttigs te produceren met R van de terminal. Met behulp van de GUI produceren de twee functies niets.
toegevoegd de auteur BenBarnes, de bron

1 antwoord

Het lijkt erop dat dump.frames kan worden verteld om niet naar een bestand te dumpen, maar naar een object in de .GlobalEnv . Ik heb het echter niet op iets anders getest dan op een Mac. Zou het volgende helpen?

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.

Er kan een nadeel zijn aan het maken van het object theErr in de globale omgeving, neem ik aan.

> theErr
$`function() 
{
    dump.frames("theErr", to.file = FALSE)
    cat("What`


attr(,"error.message")
[1] "Error: could not find function \"prnit\"\n"
attr(,"class")
[1] "dump.frames"
2
toegevoegd
Soms is het antwoord "No way." Bedankt voor uw inspanningen!
toegevoegd de auteur Karsten W., de bron
Bedankt voor de hint naar dump.frames , dit is een nieuwe functie voor mij. Kan ik bij de invoer komen die de fout heeft veroorzaakt, d.w.z. in het voorbeeld de invoer prnit (dt) ?
toegevoegd de auteur Karsten W., de bron
Ja, ik ben op zoek naar de volledige regel code
toegevoegd de auteur Karsten W., de bron
@KarstenW. Het ziet er zeker zo uit. Het is frustrerend, omdat de geschiedenis duidelijk beschikbaar is voor een lopend R-proces (via savehistory of door de pijl naar boven of Ctrl-P te typen of het equivalent), maar lijkt niet te kunnen worden opgehaald zonder het programma naar een bestand te schrijven. Ik ben een beetje nieuwsgierig of een C-programmeur een aanroep naar .Internal() of iets dergelijks zou kunnen gebruiken om de geschiedenis directer te benaderen, en kan proberen dat als een vraag te formuleren, wanneer ik een moment. In ieder geval bedankt voor de interessante vraag!
toegevoegd de auteur Josh O'Brien, de bron
Ah, is het dat de foutmelding alleen de functie teruggeeft die het niet kon vinden in plaats van de volledige regel code die het heeft geproduceerd?
toegevoegd de auteur BenBarnes, de bron
@KarstenW., Ik denk dat ik begrijp wat je bedoelt, maar omdat tail (rawhist, 1) in je voorbeeld niets belangrijks teruggeeft op deze machine, is het nog steeds een gok. Ik zal kijken of ik morgen vooruitgang kan boeken.
toegevoegd de auteur BenBarnes, de bron
@KarstenW., Ik weet niet zeker of ik begrijp wat je bedoelt met 'bereiken'. Wat zou je willen doen met prnit (dt) ?
toegevoegd de auteur BenBarnes, de bron
@KarstenW., Helaas geen voortgang te melden, behalve dat het toevoegen van een taak-terugroep om de laatste expressie opgeslagen door de gebruiker op te slaan, zoals beschreven here lijkt de uitdrukking die een fout produceert niet op te slaan. Maar waarschijnlijk heb je dat al ontdekt.
toegevoegd de auteur BenBarnes, de bron
@KarstenW., Zoals Josh suggereert, iemand met een goede kennis van de C- en de R-broncode is misschien beter in staat om een ​​oplossing te maken. savehistory roept de functie C do_savehistory aan, zoals u kunt zien door het bestand ./src/main/names.c in de R-broncode te bekijken. Verder zijn er de bestanden in de map ./src/gnuwin32/getline die mogelijk ook inzicht bieden.
toegevoegd de auteur BenBarnes, de bron