Rの例外処理とスタックの巻き戻し
-
12-12-2019 - |
質問
私の同僚と私のRスクリプトのためのコヒーレントな例外処理インタフェースを設定するために、次のtryCatch構造を採用したいです。
- 外部のtryCatchは特定のRスクリプトの周りに包まれています。それはスクリプトが中止される必要がある致命的なエラーをキャッチして処理するために使用されます。
- ユーザーのスクリプト内のユーザー固有の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)
})
. 所属していません StackOverflow