有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}");
}
}
所以我想我想做的事情是不可能的。
答案 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