仅捕获"子例外"没有魔术字符串的主要异常类型

时间:2016-05-25 18:25:12

标签: .net exception-handling

System.InvalidOperationException例外情况,但根据多个条件抛出,其中一些情况如下:

Sequence contains more than one element
Sequence contains no elements

我不想处理每个System.InvalidOperationException。我可能只想处理Sequence contains no elements,同时允许其他人正常抛出,但这样做的唯一方法是使用魔术字符串来匹配异常消息,由于显而易见的原因这是不安全的。 / p>

是否有任何安全方法可以处理累积到主要类型的个别异常?

更新:对于任何想知道我为什么不使用.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}");
    }
}

所以我想我想做的事情是不可能的。

3 个答案:

答案 0 :(得分:1)

尝试在对象上使用SingleOrDefault(),然后检查对象是否为空。如果对象为null,那么您知道它不包含任何元素,但是如果它抛出异常,那么您知道它包含多个元素!

答案 1 :(得分:1)

在您的具体示例中,没有。看看这些不同的例外情况,它们都具有Any()以外的相同属性,因此没有什么比区分它们更安全了。

显然,您可以使用预防性措施,例如Count()SingleOrDefault(),{{1}}等来确定操作 一个例外,但没有什么比区分这两个问题的消息更好了。

答案 2 :(得分:0)

这是一个不同的策略:

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