Вы просто возвращаете запрос 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>
.