2016-05-25 15 views
0

還有的System.InvalidOperationException例外,但它是基於多個條件拋出,有幾個,其中如下:趕上主要異常類型的唯一的「子例外」不用魔法串

Sequence contains more than one element 
Sequence contains no elements 

我不想要處理每個System.InvalidOperationException。我可能只想處理Sequence contains no elements,同時允許其他人正常拋出,但似乎這樣做的唯一方法是使用一個魔術字符串來匹配異常消息,由於顯而易見的原因,這是不安全的。

有沒有安全的方式來處理捲起主要類型個別例外?

更新:大家很奇怪,爲什麼我不使用.SingleOrDefault和檢查空,那是因爲我這樣做:

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

一種更好的方式來處理你所描述的錯誤,是不是讓他們在第一時間拋出。例如,爲了避免「Sequence contains no elements」,你可以使用'FirstOrDefault'而不是'First'並檢查null。對於其他情況也是如此。 – Joe

+0

@Joe更新我的問題,爲什麼我想這樣做。 – 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