4

Web アプリケーション内で R 関数を呼び出すときに、エラーが発生したときにスタック トレースをキャッチし、デバッグ目的でユーザーに提示したいと考えています。traceback()対話型セッションでの出力のようなもの。ただし、tracebackエラーハンドラー内で呼び出された場合は機能しないようです。次を返しますNo traceback available

f <- function() {
    g <- function() stop("test traceback")
    g()
}

errhandler <- function(e){
  stacktrace <- traceback()
  unlist(stacktrace);
}

out <- tryCatch(f(), error=errhandler) 

プログラムでエラーのスタック トレースをキャッチする方法はありますか? traceback()つまり、エラーの後に手動で呼び出したときに得られる出力を取得します。

f()
traceback()
4

3 に答える 3

1

のトレースバックのようにスタックを取得できなかったので、コール スタックも返すことを除いて、のtry_capture_stackように機能するソリューションを作成しました。きれいですが、後で検査するためにスタックを保存しません...trytools:::.try_quietly

tryStack <- function(
expr,
silent=FALSE
)
{
tryenv <- new.env()
out <- try(withCallingHandlers(expr, error=function(e)
  {
  stack <- sys.calls()
  stack <- stack[-(2:7)]
  stack <- head(stack, -2)
  stack <- sapply(stack, deparse)
  if(!silent && isTRUE(getOption("show.error.messages"))) 
    cat("This is the error stack: ", stack, sep="\n")
  assign("stackmsg", value=paste(stack,collapse="\n"), envir=tryenv)
  }), silent=silent)
if(inherits(out, "try-error")) out[2] <- tryenv$stackmsg
out
}

lower <- function(a) a+10
upper <- function(b) {plot(b, main=b) ; lower(b) }

d <- tryStack(upper(4))
d <- tryStack(upper("4"))
cat(d[2])

ここでの私の答えの詳細: https://stackoverflow.com/a/40899766/1587132

于 2016-11-30T23:02:18.500 に答える