2016-10-03 40 views
0

我想用try-catch檢查由0正確的地方加入的try-catch C#

((double)o.Close - (double)subList.Skip(idx - t + 1).First().Close)/
(double)subList.Skip(idx - t + 1).First().Close 

被劃分...但我不知道在哪裏添加try-catch。我嘗試添加包括整個var newList =,但不允許,因爲變量newList以後不再存在。那麼添加try-catch的適當位置在哪裏?

var newList = data.GroupBy(o => o.Date).Where(o => o.Key <= Beginday).OrderByDescending(o => o.Key).Take(Y).SelectMany(o => o).GroupBy(x => new { x.Symbol }) 
       .Select 
       (
        x => 
        { 
         var subList = x.OrderBy(y => y.Date).ToList(); 
         return subList.Select((y, idx) => 
         { 
          return new 
          { 
           Symbol = y.Symbol, 
           Close = y.Close, 
           Date = y.Date, 
           Vol = (idx < t - 1) ? 0 : new DescriptiveStatistics(subList.Skip(idx - t + 1).Take(t) 
           .Select(o => 
           ((double)o.Close - (double)subList.Skip(idx - t + 1).First().Close)/(double)subList.Skip(idx - t + 1).First().Close).ToList()).StandardDeviation,        
         }; 
         }); 
        } 
       ) 
       .SelectMany(x => x) 
       .ToList();  
+0

你不能把一個try..catch裏面的linq查詢。你v =只能做一個測試,看你是否打零跳,然後在查詢中給它一個零(或-1)的值。 – Van

+0

你真的應該首先檢查分母。不要對預期行爲使用try-catch。 – siride

+0

@ Van是否意味着linq查詢中的所有內容都不能被try-catch連臨時變量? –

回答

0

取決於你要在你釣到的魚做什麼 - 如果你想newList有一個有效的值,即使除數爲0,那麼你應該有你的0檢查集成到主碼流而比使用例外流量。

但是,要直接以書面形式回答您的問題,請先將newList聲明爲默認值,然後在try/catch塊內重新分配(將您編寫的代碼的全部內容放入try中,並使用顯式的default嘗試之前的聲明)。然後,當您需要稍後使用它時,newList將存在。

0

如果你想趕上一切,然後

 try 
      { 
      var newList = data.GroupBy(o => o.Date).Where(o => o.Key <=      Beginday).OrderByDescending(o => o.Key).Take(Y).SelectMany(o => o).GroupBy(x => new { x.Symbol }) 
      .Select 
      (
       x => 
       { 
        var subList = x.OrderBy(y => y.Date).ToList(); 
        return subList.Select((y, idx) => 
        { 
         return new 
         { 
          Symbol = y.Symbol, 
          Close = y.Close, 
          Date = y.Date, 
          Vol = (idx < t - 1) ? 0 : new DescriptiveStatistics(subList.Skip(idx - t + 1).Take(t) 
          .Select(o => 
          ((double)o.Close - (double)subList.Skip(idx - t + 1).First().Close)/(double)subList.Skip(idx - t + 1).First().Close).ToList()).StandardDeviation,        
        }; 
        }); 
       } 
      ) 
      .SelectMany(x => x) 
      .ToList();  

      } 

    catch(Exception ex) 
    { 
    //your error 
     } 
+0

但我們稍後將使用'newList',這種方式是不允許的,'newList'是一個'匿名類'無法在 –

+0

@ A.Oreo之前創建。我會假設使用'newList'的代碼假設創建'newList'時不會引發異常,所以下面的代碼也應該在try-catch內部,或者在一個單獨的方法。 – Rob

+0

我同意@Rob – zcoleen

0

你當然可以這樣做:

var newList = new[] 
{ 
    new { Symbol = "", Close = 0.0, Date = DateTime.Now, Vol = 0 } 
}.Take(0).ToList(); 

try 
{ 
    var newList = data.GroupBy(o => o.Date).Where(o => o.Key <= Beginday).OrderByDescending(o => o.Key).Take(Y).SelectMany(o => o).GroupBy(x => new { x.Symbol }) 
     .Select 
     (
      x => 
      { 
       var subList = x.OrderBy(y => y.Date).ToList(); 
       return subList.Select((y, idx) => 
       { 
        return new 
        { 
         Symbol = y.Symbol, 
         Close = y.Close, 
         Date = y.Date, 
         Vol = (idx < t - 1) ? 0 : new DescriptiveStatistics(subList.Skip(idx - t + 1).Take(t) 
         .Select(o => 
         ((double)o.Close - (double)subList.Skip(idx - t + 1).First().Close)/(double)subList.Skip(idx - t + 1).First().Close).ToList()).StandardDeviation,        
       }; 
       }); 
      } 
     ) 
     .SelectMany(x => x) 
     .ToList();  
} 
catch (Exception ex) 
{ 
} 

只要名稱和類型是兩個匿名類型相同,則這工作正常。

+0

是的,這是解決方案之一,是否有可能直接在'return'中嘗試捕獲'Vol =',這是否意味着'linq query'中的所有內容都不可能是'try-catch'臨時變量? –

+0

@ A.Oreo - 在每一個有'return'語句的地方,你都可以包含'try' /'catch'。事實上,這會比捕獲整個LINQ查詢更受歡迎。 – Enigmativity