2012-01-24 12 views
1

多くの例外(明らかにIndexOutOfRangeException)を生成するコードブロックがあります。それは50,000/secまで発生する可能性があります。彼らは捕まえられるが、CPUは本当に急上昇する。コードブロックはIDataRecordで列を単にチェックします。ブロックは非常に一般的ですが、列が存在しない場合は例外がキャッチされ、ブール値が返されます。.NET例外が多すぎます

例外の数ではない場合、これは問題ではありません。私がこれを修正すると考えることができる唯一の方法は、IDataRecordの列を繰り返して処理する前に列があるかどうかを確認することですが、これは非常に高いトラフィックのアプリケーションであるため、任意の列にアクセスする前にこのループを作成してください。

私はちょうどいくつかの考えを探しています。

+25

コードを修正してください。 'IndexOutOfRangeException'はあなたが見たことのない例外の1つです! – leppie

+6

例外を扱うことは正しいアプローチではありません。なぜこれらの例外がスローされているのかに集中することをお勧めします。例外処理は無料ではなく、そのボリュームは軽量ではありません。このタイプの例外は、ほとんどの場合避けられます。 –

+24

最初に、それを処理するよりも例外を防ぐのが通常何百回も安くなります。第2に、存在しないインデックスにアクセスすることは*バグです。プログラムロジックは単に間違っています。すきま穴の上に壁紙を続けないでください。穴を固定します。 –

答えて

3

探している列が最初に存在することを確認してください。例外をスローすることは、通常はパフォーマンス上の大きなヒットになるだけでなく、これらの偽の例外はすべて、コード内の正当なバグを隠している可能性があります。

列が最初に存在することを確認する最善の方法は、これらのすべての種類のデータがこの関数の前提と一致するようにすることです。または、実際のデータに沿って関数を呼び出すこともできます。プロシージャを持つことは、プログラムの構造が実装しているビジネスロジックとよく似ていないことを意味していないときに値が存在することを前提としています。

次に、各オブジェクトのフィールドをループしてそのフィールドが実際にどのフィールドに含まれているかを確認しますが、これはカーペットの下で深刻な問題を掃除するという匂いがします。

ただし、コントロールフローの例外に頼らざるを得ません。

+0

合意。私は呼び出しコードを制御することはできませんが、その終わりをきれいにすることはオプションではありません。実行前に列が存在することを確認することがコンセンサスのようです。私はそれを試し、それがどれほど高価であるかを見るでしょう。 – CYAD

+0

列が存在するかどうかを確認する最良の方法は何ですか? 2番目の段落に記載されているコード例を提供できますか? – MrBoJangles

0

インデックスを介して列をチェックしている場合。最初に例外を回避する必要があります。 、代わりにIDataRecordIsDBNullメソッドを使用します詳しくはhere

と列が存在する場合は、[はい、あなたは、私がこの問題を解決するために考えることができますIndexOutOfRangeException

0

」唯一の方法であり得ている理由です、最初にチェックする必要がありますIDataRecordの列を反復処理して、処理前に列があるかどうかを確認します。

このエラーは、配列の最後を超えている場合にのみ発生します。あなたは例外を約5,000〜10,000クロックサイクルコスト、ちょうど私が何を読んでから、現在のコラム「カウント」

for(int i = 0; i < column.count; i++) 
{ 
dowork(column[1]); 
} 

を取得し、各列をステップ実行する必要はありません。ほとんどの場合、列を反復処理するほうがはるかに安くなりますが、オブジェクトのプロパティによって、実際に毎回数えずに列の数がわかるようになります。

+0

インデックスではなく、名前で列にアクセスしています。 – CYAD

+0

http://stackoverflow.com/questions/373230/check-for-column-name-in-a-sqldatareader-object "r.GetSchemaTable()。Columns.Contains(field)" – Bengie

関連する問題