попробуй поймать пропущенное исключение - PullRequest
0 голосов
/ 07 мая 2018
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 голосов
/ 07 мая 2018

Вы просто возвращаете запрос 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 call GetEnumerator, поэтому они будут выполнять запрос. MSDN:

Метод ToList<TSource>(IEnumerable<TSource>) вызывает немедленное оценка запроса и возвращает List<T>, который содержит запрос Результаты. Вы можете добавить этот метод к вашему запросу, чтобы получить кэшированная копия результатов запроса.

ToArray<TSource> имеет похожее поведение, но возвращает массив вместо List<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...