Oto przykładowy kod:Dlaczego wyjątek nie został złapany w zamknięciu?
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;
}
}
Teraz, jeśli nie był wyjątkiem wewnątrz loggingProvider.ReadLogs()
metody, zostanie złapany i prześledzić. Ale jeśli, na przykład, nie ma ParticipantObjects[0]
, ten wyjątek nie zostanie tutaj przechwycony i wyśledzony. Wydaje się, że ma to coś wspólnego z wyrażeniami lambda i zamknięciami.
Jakie jest wytłumaczenie?
zapytanie nie jest uruchamiane, dopóki coś z nim nie zrobisz – user1666620