質問

私の同僚と私のRスクリプトのためのコヒーレントな例外処理インタフェースを設定するために、次のtryCatch構造を採用したいです。

  1. 外部のtryCatchは特定のRスクリプトの周りに包まれています。それはスクリプトが中止される必要がある致命的なエラーをキャッチして処理するために使用されます。
  2. ユーザーのスクリプト内のユーザー固有のTryCatchコマンド。これらはキャッチし、おそらく、ハンドルを扱うべきです
    • 2a。スクリプトの中止が必要な非致命的なエラー
    • 2b。スクリプトが中止する必要がある致命的なエラー。エラーは外側のtryCatchによって処理されます[1を参照]
    • 2c。追加のエラー情報を持つ致命的なエラー。外側のtryCatchによって処理されたエラー。

      次のコードは、私がこれらの機能を実装する方法です。しかし、私はRの専門家ではないので、これが良いアプローチであるかどうかを尋ねたいです。具体的には:

      Q1。内部のTryCatchでエラーハンドラを指定し、そのエラーを処理するのを待つことはできません(2Bを参照)。

      Q2。ハンドラの内側に同じエラー(2C。下/下に参照)が正しくなります。

      ありがとうございました!

      #outer tryCatch, see 1.
      tryCatch({
        #user code block
        #2a. user specific tryCatch, object "vec" not defined
        tryCatch(print(vec),error=function(e) {print("Non-fatal error. Script execution continued.");print(e);})
      
        #2b. user specific tryCatch
        tryCatch(vec*2)
      
        #2c. user specific tryCatch
        tryCatch(vec*parameter1, error=function(e) {print("Additional fatal error information. Script execution aborted.");stop(e);})
        #end of user code block
      },
           #outer tryCatch error handler in order to handle fatal errors
           error=function(e) {print("Fatal error");print(e);} 
          )
      
      .

役に立ちましたか?

解決

誤ったエラーだけを捕まえるのは完全に問題ありません。エラーシステムは通常使用されるよりもかなり柔軟性があるため、エラーを再投入するためには、独自のエラータイプを作成することを考える可能性があります。

ourError <-
    function(original, message, class="ourError")
{
    msg <- paste(message, conditionMessage(original), sep="\n  ")
    structure(list(message = msg, call = conditionCall(original)),
              class = c(class, class(original)))
}
.

を投げるおよび/またはそのの取り扱い

tryCatch(vec*parameter1, error=function(e) {
    err <- ourError(e, "addition fatal info; script aborted")
    stop(err)
})
.

これの1つの利点は、ourError() によって返されるクラスを使用して、最上位ハンドラで追加の動作を指定できることです。

tryCatch({
    tryCatch(stop("oops"), error=function(e) {
        err <- ourError(e, "addition fatal info; script aborted",
                      c("fatal", "ourError"))
        stop(err)
    })
}, ourError=function(err) {
    message("We caught but didn't handle this:\n", err)
}, error =function(err) {
    message("This one got away: ", err)
})
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top