2011年4月13日水曜日

◆フィルター時のNULL参照エラー対策

nullオブジェクトのメソッドなどを実行しようとしてエラーが発生することはよくある。

image

これを回避する方法をいくつか考えてみた。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016

$array = ("a","b","c","B",$null)
$array | ?{$_.ToUpper() -eq "B"}

"対策1"
$ErrorActionPreference = "SilentlyContinue"
$array | ?{$_.ToUpper() -eq "B"}
$ErrorActionPreference = 
"continue"

"対策2"

$array | ?{try{$_.ToUpper() -eq "B"}catch{}}

"対策3"
$array | ?{$_} | ?{$_.ToUpper() -eq "B"}

"対策4"
$array | ?{$_ -and $_.ToUpper() -eq "B" }
<!--EndFragment

結果。

image

結果としてはどの対策も良さそうだ。
さてどれにしたものか。

対策1はちょっと無理やり的だしコーディング量も多いので却下。
対策2は悪くは無いと思うが、ブロックが増えるので若干書きづらい。
対策3は考え方が素直だしコーディング量的にも多くない。しかし、データ量が多い場合はパイプが増える分不利かもしれない。

対策4がコーディング量的にも性能的にもベターかとも思うが、幾分トリッキー?

これは、$_ がnullの時はand条件のそれ以降の判定が実行されないという動作を利用している。C#で言うところの&&演算子みたいな動作。しかし、 &&演算子と全く同じかというとそうでもなくて、nullでの除算などを行うとエラーになってしまうので使用に当たっては注意が必要。

結局、自分だけで使うスクリプトなら対策4、そうでなければ対策3、性能まで求められる処理ならば対策2といったところかな。

当然、素直にIFで判定しても良いけど。

0 件のコメント:

コメントを投稿