2015-09-06 57 views
2

我正在研究在頁面中嵌入JSON的應用程序。一些簡單的例子:調試序列化期間消耗的yield return的最佳方法是什麼?

public ViewResult Page(IEnumerable<LolCat> lolCats) 
{ 
    var json = new 
    { 
     localCats = ToJson(lolCats), 
    }; 

    return View(json); // this gets serialized somewhere in the ASP pipeline 
} 

IEnumerable<object> ToJson(IEnumerable<LolCat> lolCats) 
{ 
    foreach (var lolCat in lolCats) 
     yield return new { name = lolCat.name }; 
} 

的JSON 得到自動序列倒在ASP.NET管道線路的某處。

在這個例子中,假設有時一個NULL滑入lolCats,拋出異常。問題是ToJson函數可能會在整個應用程序的很多不同的地方被調用。

如何找出ToJson是哪一個呼叫是異常的責任人?調用堆棧在實際使用此IEnumerable的序列化程序中結束,因此您看不到'原始堆棧跟蹤'

The call stack ends in the Serializer that is actually consuming this IEnumerable, and therefore that's not working

一個簡單的解決將是內Page打電話ToList()。但我正在尋找一種不會打破方法惰性的方法。

+0

不能:)對不起,嘲笑了一些例子。我會解決它!謝謝:) –

+0

返回lolCats.Select(lolCat => new {name = lolCat.name})有什麼問題;'然後?這也將推遲執行。 – dasblinkenlight

+0

對不起,也許我應該讓我的問題更清楚一點。現實世界的例子更深入。我正在尋找一種工作方式在這些情況下 - 不是一個真正具體的例子來解決:) –

回答

1

由於延期性質,您將永遠不會收到哪一個實際產生異常的電話ToJson()。這個系列從未被首先檢查,直到它被首次枚舉(當它被序列化時)。

您需要向您的枚舉器注入一些有關調用它的信息。

例如,

IEnumerable<object> ToJson(IEnumerable<LolCat> lolCats, string id) 
{ 
    try 
    { 
     foreach (var lolCat in lolCats) 
      yield return new { name = lolCat.name }; 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(id, ex); // use a more appropriate exception 
    } 
} 

然後,它只是一個產生id的事情,可以幫助識別來電者。

+0

嗨傑夫梅爾卡多,謝謝你的回答!我希望有一些解決方案不那麼突兀 - 也許在調試器中會發生類似的情況:)但最有可能是錯誤的希望。 –

相關問題