我正在开发一个在页面中嵌入JSON的应用程序。一些简化的例子:
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的哪个调用是负责该异常的?调用堆栈在Serializer中结束,实际上正在消耗此IEnumerable,因此您不会看到&#39;原始堆栈跟踪&#39; 。
一个简单的解决方法是在ToList()
内拨打Page
。但是,我正在寻找一种不会破坏方法懒惰的方法。
答案 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
即可帮助识别来电者。