2017-01-20 12 views
1

Rは特定の例外のみに対して例外処理を対象とすることをサポートしていますか?特定の例外に対する例外処理のターゲット方法


たとえば、Pythonでは、例外処理を特定の例外タイプに絞り込むことができます。例:この例では

try: 
    return frobozz[i] 
except IndexError: 
    return DEFAULT 

は、例外処理はiが整数である場合のみでキックするようなi >= len(frobozz)i < -len(frobozz)、しかし、例えば、iが文字列"0"ある場合起因する例外をキャッチしません。 (IndexErrorではなくTypeErrorとなります)。

+0

あなたは本当に何をしようとしていますか? –

+0

通常、例外を回避するために入力チェックを実装します。 – Roland

+0

私はRの同様の機能については気づいていませんが、エラー処理機能については十分に検討していません。出発点としては、 '?tryCatch'に含まれるメインヘルプファイルとリンクlinkaを読むのが便利です。 – lmo

答えて

1

Wellllll ...はい、いいえ、ほとんどありません。

すべてのPython例外はErrorから派生した特定のエラークラスにラップされ、Pythonモジュールは「正しい」種類のエラーを発生させることになっています。たとえば、範囲外のインデックスのエラーは、IndexErrorをスローする必要があります。基本言語はこれらのエラーを知っているので、except ...句で適切なエラータイプをキャッチできます。

Rはそうしていません。エラーは型なしです。境界外のインデックスと他のエラーとの間に本質的な違いはありません。

しかし、非常に限られた特定の状況下では、あなたが不正行為をする可能性があります。

> y <- tryCatch(x[[2]], error = function(e) e) 
> y 
<simpleError in x[[2]]: subscript out of bounds> 
> y$message 
[1] "subscript out of bounds" 

ここで重要なのは、tryCatch機能とerror句の使用です。 tryCatchのエラー句は、 'simpleError'型のオブジェクトであり、 "message"という項目を含むeに対して任意の操作を実行できる1つの変数の関数です。あなたが実際にあなたが見てみたいエラー文字列を検出することができ、それが保証されていない場合は、別途

> y <- tryCatch(x[[2]], 
    error = function(e) { 
    if ('subscript out of bounds' == e$message) return(NA) else stop(e)) 
    }) 
> y 
[1] NA 

これはのみ動作し、メッセージを解析し、興味深い事例を扱うことができます。 (そして再び、Pythonでは保証されていないので、事柄はお互いに大きな違いはありません。)

最終的な質問:なぜ天国の名前でこれをやっていますか?あなたは何ですか実際にをしようとしていますか?

+0

しかし、分かりやすくするためには、x [['a']] 'をキャッチしません。これはNAを返します。 Rはルックアップの値の型によるエラーを区別しません。ルックアップ演算子を再定義することの短さ - これはやめないことを強くお勧めします。 - 私はそれをまったくやる方法を考えることはできません。 – JWLM