在Linq中捕获异常
本文关键字:捕获异常 Linq | 更新日期: 2023-09-27 18:04:36
我的c#代码中有这个问题。我在我的linq代码中得到一个异常,想知道如何捕获它。我已经搜索了SO,但是没有找到任何相关的问题。
我已经简化了我的查询:
var test = from values in myTable.AsEnumerable()
select new valueSet
{
ID = values["ID"].ToString(),
Number = values["Number"].ToString(),
Name = this.getName(values["Number"].ToString()),
}
由于我在运行函数getName时在查询中得到异常,我希望能够捕获异常,以及Number我目前所在的位置。像这样:
try
{
var test = from values in myTable.AsEnumerable()
select new valueSet
{
ID = values["ID"].ToString(),
Number = values["Number"].ToString(),
Name = this.getName(values["Number"].ToString()),
}
catch (Exception ex)
{
//I want to use "Number" here!
throw ex;
}
我知道我在try中声明了测试变量,但是我可以为每个"linq-loop"存储当前的Number吗?有什么建议吗?
要实现这一点,您必须使用使用扩展方法和lambda的"other" LINQ语法:
var test = myTable.AsEnumerable().Select(values =>
{
try
{
return new valueSet
{
ID = values["ID"].ToString(),
Number = values["Number"].ToString(),
Name = this.getName(values["Number"].ToString()),
};
}
catch(Exception ex)
{
throw new ApplicationException("cannot load number" + values["Number"].ToString());
}
});
一个快速测试来展示什么可以工作。定义一个自定义异常类:
public class MyException : Exception
{
public MyException(TestClass testClass)
{
TestClass = testClass;
}
public TestClass TestClass { get; set; }
}
为了演示,我使用自定义的TestClass
,但这将是您的表:
public class TestClass
{
public int Id {get; set; }
public int Number { get; set; }
public string Name {get; set; }
}
您的getName
操作看起来像:
public static string getName(TestClass testClass)
{
try
{
//functionality goes here
throw new Exception(); // just for demo purposes, throw an exception here
return testClass.Name;
}
catch (Exception ex)
{
throw new MyException(testClass);
}
}
以及演示如何捕获数字的主要方法:
static void Main(string[] args)
{
var list = new List<TestClass>() { new TestClass() { Id = 1, Name= "name", Number= 789} };
try
{
var test = (from values in list
select new
{
Id = values.Id,
Name = getName(values),
}).ToList();
}
catch (MyException ex)
{
//I want to use "Number" here!
var number = ex.TestClass.Number;
throw ex;
}
}
PS—不要介意static关键字,这个测试是在控制台应用程序中完成的。