try
{
return strngarray.Select(strngarrayelem =>
{
string[] data = strngarrayelem .Split(',');
return new xyzClass(data[1], data[2], data[0], (Color)System.Windows.Media.ColorConverter.ConvertFromString(data[3]), data.Length > 4 ? data[4] : "N/A");
});
}
catch (Exception ex)
{
MessageBox.Show("abc");
return Enumerable.Empty<xyzClass>();
}
我在
中遇到格式异常(Color)System.Windows.Media.ColorConverter.ConvertFromString(data[3])
我尝试通过try-catch捕获它但是异常仍然被应用程序级别的try catch抛出而没有被我的本地try catch捕获。 为什么我的尝试没有收到错误?
答案 0 :(得分:6)
您只是返回一个LINQ查询,它尚未执行(例如,使用ToList
)。
因此,如果您想在此处捕获异常,则应考虑在此方法中将其实现为集合。由于IEnumerable<xyzClass>
实现了该接口,您仍然可以返回List<xyzClass>
。
try
{
return strngarray.Select(strngarrayelem =>
{
string[] data = strngarrayelem .Split(',');
return new xyzClass(data[1], data[2], data[0], (Color)System.Windows.Media.ColorConverter.ConvertFromString(data[3]), data.Length > 4 ? data[4] : "N/A");
}).ToList(); // <------- HERE !!!
}
catch (Exception ex)
{
MessageBox.Show("abc");
return Enumerable.Empty<xyzClass>();
}
如果您不知道哪种方法只是返回查询,请查看MSDN中有关关键字deferred
的文档。例如Enumerable.Select
:
此方法通过使用延迟执行来实现。该 立即返回值是存储所有信息的对象 这是执行操作所必需的。由此表示的查询 方法在枚举对象之前不会执行 直接或使用调用其
GetEnumerator
方法foreach
强>
例如Enumerable.ToList
或ToArray
调用GetEnumerator
等方法,因此他们将执行查询。 MSDN:
ToList<TSource>(IEnumerable<TSource>)
方法迫使立即行动 查询评估并返回包含查询的List<T>
结果。您可以将此方法附加到查询中以获取 缓存的查询结果副本。
ToArray<TSource>
具有类似的行为但返回数组而不是List<T>
。