Как обрабатывать исключения, возникающие в linq - PullRequest
3 голосов
/ 05 июля 2011

gyus! Предположим, у меня есть такое простое выражение LINQ

IEnumerable<StopListMatchViewModel> res =
    from rqResult in MatchesList
    select new StopListMatchViewModel
        (
        )
        {
            MatchDate = DateTime.ParseExact(rqResult.Row["MatchDate"].ToString(), "dd.MM.yyyy HH:m:ss", fmtInfo),
            Remark = rqResult.Row["Remark"].ToString()
        }

если строка не может быть проанализирована в соответствии с указанной маской формата - я получаю исключение FormatException. В отладчике я могу узнать об этом в представлении результатов переменной «res». В реальном времени я получаю пустую коллекцию.

Может быть много примеров различных исключений, которые могут произойти во время выполнения LINQ. Как я мог поймать и справиться с ними? блок try catch здесь не работает, потому что, как мне кажется, исключение не возникает.

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Из-за отложенного выполнения запрос не будет выполнен, пока вы не оцените запрос, например, с помощью метода .ToList(). Исключение будет выдано только в это время.

Чтобы избежать проблемы, вам нужно изменить запрос. что-то, как показано ниже

IEnumerable<StopListMatchViewModel> res =
    from rqResult in MatchesList
    select new StopListMatchViewModel
    {
        MatchDate = DateTime.ParseExact(
            ((rqResult.Row["MatchDate"]==null) ?
                rqResult.Row["MatchDate"] : DateTime.MinValue).ToString(), "dd.MM.yyyy HH:m:ss", fmtInfo),
        Remark = rqResult.Row["Remark"].ToString()
    }

Примечание: DateTime.MinValue используется, когда значение rqResult.Row["MatchDate"] равно нулю, которое используется, чтобы избежать нуля

0 голосов
/ 05 июля 2011

Используйте метод TryParseExact , чтобы избежать ненужных исключений.
Я не понимаю, почему вы не можете использовать блок try-catch? Вы действительно думаете, что это не подняли? Также вам следует проверить вашу базу данных на NULL-значения:

MatchDate = Convert.IsDBNull (rqResult.Row["MatchDate"]) ?   
  DateTime.MinValue : 
  DateTime.ParseExact(rqResult.Row["MatchDate"].ToString(),
    "dd.MM.yyyy HH:m:ss", 
    fmtInfo),
Remark = (string)rqResult.Row["Remark"] ?? String.EmptyString;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...