3

私は機能を持っています:

buggy <- function(...) {
    tryCatch({
        itWorked <- FALSE
        stop("I don't like green eggs and ham!")
        itWorked <- TRUE
    }, finally = {
        if ( itWorked )
            return("I do, Sam I am")
        else
            return("I do not like them, Sam I am!")
    })
}

基本的に、buggy成功するかもしれないし、成功しないかもしれないいくつかの計算を試みます ( によって決定されitWorkedます。このfinally句は、計算が機能しなかった場合でも、何かが返されるようにします (この場合は"I do not like them, Sam I am!")。

期待どおりに動作します:

> buggy()
Error in tryCatchList(expr, classes, parentenv, handlers) : 
  I don't like green eggs and ham!
[1] "I do not like them, Sam I am!"

今、私はエラーをリッスンしたいbuggy():

tryCatch( buggy(), 
          error=function(e) message('too bad! there was an error') )

ただし、エラーbuggyは周囲でエラーを発生させませんtryCatch:

> tryCatch( buggy(), 
+           error=function(e) message('too bad! there was an error') )
[1] "I do not like them, Sam I am!"

私はこれが言うことを期待します:

'too bad! there was an error'
[1] "I do not like them, Sam I am!"

これが機能しない理由を誰か教えてもらえますか? どういうわけか、内部からエラーを「発生させる」必要がありますbuggyか?

4

1 に答える 1

2

アウターは、次の呼び出しが提供しないのとまったく同じ理由で、引数にtryCatch()格納されたメッセージを提供しません。error

tryCatch("I do not like them, Sam I am!",
    error=function(e) message('too bad! there was an error') )
# [1] "I do not like them, Sam I am!"

2行上の引数のメッセージは、エラーが返されたerror場合にのみ呼び出されます。しかし、代わりに(その内部のbuggy()作業のおかげで)、文字ベクトルを返すだけで、「キャッチ」するものは何もありません。tryCatch()buggy()tryCatch()

value <- buggy()
value
# [1] "I do not like them, Sam I am!"

# And, to belabor the point:
identical(buggy(), "I do not like them, Sam I am!")  
# [1] TRUE
于 2012-04-19T06:24:14.913 に答える