Ecco l'esempio di codice:Perché l'eccezione non è stata rilevata nella chiusura?
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;
}
}
Ora, se ci fosse un'eccezione all'interno di loggingProvider.ReadLogs()
metodo, saranno catturati e rintracciati. Ma se, ad esempio, non esiste lo ParticipantObjects[0]
, questa eccezione non verrà rilevata e tracciata qui. Sembra che abbia qualcosa a che fare con espressioni e chiusure lambda.
Qual è la spiegazione?
una query non viene eseguita finché non si fa qualcosa con esso – user1666620