You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda内抛出的异常未被Catch块捕获,求原因与解决办法

问题核心:LINQ的延迟执行特性

你遇到的问题根源是LINQ的延迟执行机制——Where这类LINQ方法不会立刻执行你写的Lambda表达式,它只是生成了一个"查询计划",只有当你真正去遍历这个查询结果(比如用foreach、ToList()、ToArray())时,Lambda里的代码才会实际运行。

在你第一个版本的代码里,你只是给collection赋值了一个查询对象,但没有触发任何遍历操作,所以Lambda中的x.Prop1.ToString()根本没机会运行,自然不会抛出异常,catch块也就不会被触发。而当你添加foreach遍历后,查询被执行,Lambda代码运行,空引用异常抛出,这时候遍历操作在try块内,所以异常被catch捕获。

解决方案:强制立即执行查询

如果你想让Lambda执行时的异常被当前try/catch捕获,需要强制立即执行查询,而不是只保留查询计划。最常用的方式是调用ToList()或ToArray()这类方法,把查询结果转换成具体的集合:

class MyObj
{
    public object Prop1 { get; set; }
}

public void Get()
{
    try
    {
        IEnumerable<MyObj> collection = new List<MyObj>() { new MyObj() };
        // 调用ToList()立即执行查询,Lambda代码会在这里运行
        collection = collection.Where(x =>
        {
            return x.Prop1.ToString() == "some value";
        }).ToList();
    }
    catch (Exception ex)
    {
        throw new UriFormatException($"Invalid filter. Error details: {ex.Message}");
    }
}

这样修改后,Where后的ToList()会立即遍历并执行Lambda逻辑,此时如果Prop1为null,异常会在try块内抛出,被catch捕获。

如果你的场景不适合立即执行(比如数据量极大),那只能把后续遍历查询的代码放在try/catch块中,但根据你的需求,立即执行是最直接的解决方案。

内容的提问来源于stack exchange,提问作者Rachel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:18:16