2016-05-25 2 views
0

System.InvalidOperationException例外がありますが、以下の通りである。そのうちのいくつか、複数の条件に基づいて投げています:キャッチは本体のみ例外タイプの「サブ例外」魔法の文字列をなし

Sequence contains more than one element 
Sequence contains no elements 

私はしないでくださいすべてのSystem.InvalidOperationExceptionを処理したい。私はちょうどSequence contains no elementsを処理するだけで、他の人は普通に投げられるようにしたいかもしれませんが、これを行うように見える唯一の方法は、明らかな理由で安全ではない例外メッセージにマジック文字列を使用することです。

メインタイプにロールアップする個々の例外を処理する安全な方法はありますか?

アップデート:私は、このやっているからだと、.SingleOrDefaultを使用し、nullをチェックしていない理由を不思議に思っ誰のために:

DbcColumn = DbcTable?.Columns.Single(c => c.ColumnName.NonCaseEquals(FieldName)); 

?に注意してください。 DbcTableがnullの場合、残りの式は評価されず、DbcColumnはnullになります。 SingleOrDefaultを使用すると、DbcColumnはnullになりますが、DbcTableがnullだったか、SingleOrDefaultが一致しなかったかどうかわかりません。これを行うために持っていることから私を続けて:

if (DbcTable != null) 
{ 
    DbcColumn = DbcTable.Columns.SingleOrDefault(c => c.ColumnName.NonCaseEquals(FieldName)); 

    if (DbcColumn == null) 
    { 
     throw new Exception($"{nameof(DbcColumn)} {FieldName} not found in {DbcTable.DatabaseName}.{DbcTable.TableName}"); 
    } 
} 

だから私は、私はできません何をしたいかと思います。

+2

より良い方法は、彼らが最初の場所でスローさせることではありません。たとえば、「シーケンスに要素がありません」ということを避けるには、「First」の代わりに「FirstOrDefault」を使用し、nullをチェックします。他の場合も同様です。 – Joe

+0

@ジョー私はなぜこれをやりたいの私の質問への更新を参照してください。 – oscilatingcretin

+0

例外を区別できるようにするには、より優れた例外戦略が必要でした。次に、より具体的なものではなくExceptionを投げます。あなたが説くことを実践してください;) – jgauffin

答えて

1

具体的な例では、いいえ。これらの異なる例外を見ると、どちらもMessage以外のプロパティを持っているので、それらを区別するより安全なものはありません。

明らかに、操作例外をスローするかどうかを決定するためにAny()Count()SingleOrDefault()などのように予防策を使用することができますが、これらの二つの問題を区別するためのメッセージに勝るものはありません。ここで

1

オブジェクトにSingleOrDefault()を使用して、オブジェクトがnullであるかどうかを確認してください。オブジェクトがnullの場合は、要素が含まれていないことがわかりますが、例外がスローされた場合は、複数の要素が含まれていることがわかります。

0

は異なる戦略です:あなたが記述エラーを処理する

DbcColumn = DbcTable?.Columns 
        .Where(c => c.ColumnName.NonCaseEquals(FieldName)) 
        .Take(2); 
if (DbcColumn == null || DbcColumn.Count == 2) 
    //uhh ohh 
関連する問題