2012-04-19 7 views
3

私は機能があります。ネストされたtryCatchはエラーをキャッチしませんか?

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

は今、私はのエラーを聴きたいです:

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の中からエラーを「発生させる」必要がありますか?

答えて

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 
+0

おおを、私は参照してください。 'buggy'がエラー時に値を返すための標準的な手順は何ですか(私の場合は中間段階ですが、私はまだ使用できますが再計算する必要はありません)。エラーが発生しました(したがって、返された結果は最後のものではなく中間です)。 –

+0

私はちょうど言ったことを忘れて、私はちょうど私の*特定のケースでは、私は(最終的には)私はパラメータ(return.intermediate.on.error')を持っていることに気づいた: 'if(itWorked || return。 (reason_for_failure)} 'の中に' reason_for_failure'を格納しなければならないと思います。それは "Rの方法"と思われません。次のように言うといいでしょう: 'error = function(e){raise_error();リターン(...)} '。 –

+0

あなたの目的に合った 'warning()'を使って警告を出す( 'stop()'の代わりに)エラーを出すでしょうか?何かが間違っているというメッセージで通知されたがっているように聞こえるので、最も簡単な解決策になる可能性があります。 –

関連する問題