尝试抓住跳过异常

时间:2018-05-07 12:33:03

标签: c# wpf linq

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捕获。 为什么我的尝试没有收到错误?

1 个答案:

答案 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.ToListToArray调用GetEnumerator等方法,因此他们将执行查询。 MSDN:

  

ToList<TSource>(IEnumerable<TSource>)方法迫使立即行动   查询评估并返回包含查询的List<T>   结果。您可以将此方法附加到查询中以获取   缓存的查询结果副本。

     

ToArray<TSource>具有类似的行为但返回数组而不是   List<T>