Nen*_*vic 5 c# lambda exception
这是代码示例:
public IList<LogEntry> ReadLogs(Guid id, string name)
{
var logs = this.RetrieveLogs(id, name);
if (logs != null)
{
foreach (LogEvent logEvent in logs)
{
// bla, bla, bla
}
}
return logEntries;
}
private IEnumerable<LogEvent> RetrieveLogs(Guid id, string name)
{
try
{
FilterCriteria filterCriteria = CreateFilterCriteria();
return (from log in this.loggingProvider.ReadLogs(filterCriteria, 1)
where log.ParticipantObjects[0].ParticipantObjectId == id.ToString()
&& log.LogEventParameters[0].Value == name
orderby log.Timestamp.ToLocalTime() descending
select log).AsEnumerable();
}
catch (Exception ex)
{
this.tracer.Write(Category.Error, ex, "Error");
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果loggingProvider.ReadLogs()方法内部存在异常,则会捕获并跟踪它.但是,例如,如果没有ParticipantObjects[0],则此异常将不会被捕获并在此处跟踪.它似乎与lambda表达式和闭包有关.
解释是什么?
Eri*_*ert 15
我之前已经说过了,我无疑会再说一遍: 了解查询最重要的一点是查询是一个问题,而不是问题的答案.
您构建的查询对象不仅仅通过构建它来执行.你正在构建这个问题.在您执行查询之前,问题实际上并未得到询问和回答.并且执行在try块之外.
loggingProvider.ReadLogs在里面执行RetrieveLogs.但是只有当你在外部迭代它们时才会执行所有其他lambdas this.ReadLogs.
因此,在您的上层方法中抛出异常,因此无法在内部捕获RetrieveLogs.
为了避免这种情况,更改AsEnumerable到ToList()或ToArray()以确保查询返回前实际执行.
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |