使用 lambda/linq 语句进行异常处理

Exception handling with lambda/linq statements

我有以下声明,我正在尝试将 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;
    }
  }

请告诉我如何处理此语句中的异常谢谢。 注:手机phone写本题无法格式化代码。对此表示歉意。

方括号 ({ }) 内的所有内容都需要具有 'regular' 块语法,因此此处需要 return:

...
.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 以保留调用堆栈。

您应该将 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会returnnull

...that I am trying to use try catch block with

我猜你可能打算根据你想要 try/catch 的位置来写 FirstOrDefault。在您提供的示例代码中,我认为没有理由尝试将 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

或类似的代码更接近你没有我的代码 "optimization"

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 的容器collection 这让我相信你正在使用 EF 或其他一些 ORM。因此,即使您通过添加 try/catch 块编译来修复语法和代码,您稍后在执行 lambda 时也会遇到 运行 时间错误。