2014-05-21 45 views
1

我在我的C#代碼中有這個問題。我在我的Linq代碼中得到一個異常,並想知道如何捕捉它。 我已經搜索過,但找不到任何相關的問題。Linq內部的捕獲異常

我已經簡化我查詢到這一點:

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當得到查詢裏面一個例外,我希望能夠捕獲異常,也該號碼我目前在。事情是這樣的:

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環」保存當前的號碼?有什麼建議麼?

+0

你可以在'this.getName'裏面使用'try ... catch' – Grundy

+2

爲什麼這個被downvoted兩次?這個問題對我來說看起來是正確的和間接的。 – Larry

+0

@Larry'Nuf說! –

回答

1

要做到這一點,你將不得不使用一個使用擴展方法和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()); 
    } 
}); 
+1

謝謝! 你先生,是一個非常聰明的人! :) –

1

快速測試顯示什麼可以工作。定義自定義異常類:

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關鍵字,這個測試是在控制檯應用程序中完成的。