Обработка исключений с помощью операторов lambda / linq - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть следующее утверждение, что я пытаюсь использовать блок try-catch с

var val= db.shops.where(x=>×.id==ID).Select (a=>a.address).First();

Я пытался выполнить следующее, но у меня много проблем, которые даже не компилируются.

var val=db.shops.Where(x=> 
  {
    try 
    {
        (x.Id==ID).Select(a=>a.address).First();
    }
    catch(ex)
    {
      return ex;
    }
  }

Пожалуйста, дайте мне знать, как я могу обработать исключение в этом заявлении. Спасибо.Примечание: запись этого вопроса с мобильного телефона не может отформатировать код.Извиняюсь за это.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Вы должны поместить try вокруг вашего исходного утверждения:

try
{
   var val= db.shops.where(x=>×.id==ID).Select (a=>a.address).First();
}
catch (Exception ex)
{
   return ex; //I assume the return type here is wrong.  Maybe return null?
}

Однако в этой строке нет ничего, что могло бы потребовать try/catch.Попробуйте это:

var val= db.shops.where(x=>×.id==ID).Select(a=>a.address).FirstOrDefault();

FirstOrDefault вернет null, если нет результатов.

0 голосов
/ 10 декабря 2018

... что я пытаюсь использовать команду try catch с

Я предполагаю, что вы, вероятно, хотели написать FirstOrDefault в зависимости от того, где вы хотите try/catch.В приведенном вами примере кода я не вижу причин пытаться сделать блок catch одним из операторов lambda.Лучше всего просто использовать FirstOrDefault, поскольку именно поэтому вы можете получить исключение в показанном коде.

var address = db.shops.FirstOrDefault(x => ×.id == ID)?.Address;
if(address == null)
  // nothing was found or address is null, do something else

или код, похожий на тот, который вы использовали без моей «оптимизации»

var shop = db.shops.FirstOrDefault(x => ×.id == ID);
if(shop == null) {
  // nothing was found, do something else
}
var address = shop.address;

Другая причина не использовать try / catch заключается в том, что он не может быть переведен в SQL и имя переменной db, которая является контейнером для коллекции shops, заставляет меня поверить вамиспользуете EF или другой ORM.Таким образом, даже если вы исправите синтаксис и ваш код с помощью добавленных блоков try / catch, вы получите ошибку во время выполнения позже, когда будете выполнять лямбду.

0 голосов
/ 10 декабря 2018

Все, что в скобках ({ }), должно иметь «обычный» синтаксис блока, поэтому здесь требуется возврат:

...
.Where
(x=> 
  {
    try 
    {
        return (x.Id == ID);
    }
    catch(ex)
    {
      throw;
    }
  }
)
.Select(a=>a.address)
.First(); // Or FirstOrDefault if you expect this statement to yield no result.

Как видите, Where больше похож на обычный оператор,Select перемещен за пределы Where.Если вам нужна обработка исключений, вы должны сделать то же самое, что и в блоке Where.Наконец, return ex, вероятно, должно быть throw ex, которое в этом случае должно быть throw, чтобы сохранить стек вызовов.

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