繁体   English   中英

在Linq中捕获异常

[英]Catch exception inside Linq

我的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中声明了test变量,但是我可以为每个“ linq循环”存储当前Number吗? 有什么建议么?

为此,您将必须使用使用扩展方法和lambda的“其他” 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关键字,此测试是在控制台应用程序中完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM