为什么异常没有被关闭?

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块之外.


Ren*_*ogt 5

loggingProvider.ReadLogs在里面执行RetrieveLogs.但是只有当你在外部迭代它们时才会执行所有其他lambdas this.ReadLogs.

因此,在您的上层方法中抛出异常,因此无法在内部捕获RetrieveLogs.

为了避免这种情况,更改AsEnumerableToList()ToArray()以确保查询返回前实际执行.