5

同僚のスクリプトと私の R スクリプトに一貫した例外処理インターフェイスを設定するために、次の tryCatch 構造を採用したいと考えています。

  1. 外側の tryCatch は、特定の R スクリプトをラップしています。スクリプトの中止を必要とする致命的なエラーをキャッチして処理するために使用されます。
  2. ユーザーのスクリプト内のユーザー固有の tryCatch コマンド。これらはキャッチし、場合によっては処理する必要があります
    • 2a. 致命的ではないエラー。スクリプトの中止は必要ありません
    • 2b. スクリプトの中止を必要とする致命的なエラー。エラーは外側の tryCatch によって処理されます [1. を参照]。
    • 2c。追加のエラー情報を含む致命的なエラー。外側の tryCatch によって処理されるエラー。

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

Q1. 内側の tryCatch でエラー ハンドラーを指定せず、外側の 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);} 
    )
4

1 に答える 1

5

一部のエラーのみをキャッチし、他のエラーを外部ハンドラーに残すか、ハンドラーをまったく残さないことはまったく問題ありません。エラーシステムは、通常使用されるものよりもかなり柔軟であるため、エラーを再スローするために、独自のエラータイプを作成することを考えるかもしれません。

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)
})
于 2012-10-01T15:51:24.507 に答える