繁体   English   中英

如何防止Lambda表达式中的异常

[英]How to prevent Exception from within a lambda expression

我在Visual Studio 2013中停留了一段时间,所以我为实现以下条件的空条件运算符编写了一个替代名:

public static TResult IfNotNull<TResult, TTarget>(this TTarget target, Func<TTarget, TResult> operation)
    where TResult : class
{
    if (target != null && operation != null)
    {
        try
        {
            return operation(target);
        } 
        catch (NullReferenceException)
        { }
    }

    return default(TResult);
}

我这样做是为了代替操作员来提高代码的可读性。 这摆脱了类初始化代码中使用的数百个三元运算符,这不是不好的代码,但是很难阅读。

问题不在于此功能。 它运作良好。 问题在于其用法:

var myValue = myEntity.Property.IfNotNull(p => p.FirstProperty.SecondaryProperty);

FirstProperty为null的情况下,即使我正在处理,Visual Studio也会报告NullReferenceException 如果长循环执行,这可能会非常烦人,甚至令人望而却步。 我通常不会收到NullReferenceException异常,但是我真的不想关闭此异常警告。 我捕获NullReferenceException的原因(显然,空条件运算符不执行此操作)是,在复合属性路径的情况下,我想避免IfNotNull嵌套。

我不想使用反射,因为我希望operation的内容可以是消费者想要的任何内容(例如,方法,字段,甚至是逻辑操作)。

我真的等不及要升级到Visual Studio 2017。

(是的,我知道Visual Studio 2015中提供了空条件运算符。由于它是最新版本,因此我们正在升级到2017年。)

此外:调试时,Visual Studio将异常报告为弹出窗口。 除非您正在调试,否则在运行时或在单元测试中不会发生这种情况。 我有一个catch块,调试时不应将Visual Studio弹出此异常。 它应该被抓住。

更进一步:好的,我想我知道人们在要求什么。 这不是运行时问题。 这是一个调试问题。 Visual Studio正在报告从lambda表达式中引发的NullReferenceException,该表达式是从捕获NullReferenceException的try捕获块中调用的。 为什么Visual Studio应该就此警告我,以及如何使其停止? 这就是我所能做到的简洁。

评论时间过长,请在此处发布以进行评论。

使用OP中提供的示例完成了以下单元测试

[TestMethod]
public void _TestNullCoalesceningExtension() {
    var myEntity = new MyEntity 
    {
        Property = new AnotherEntity()
    };
    var myValue = myEntity.Property.IfNotNull(p => p.FirstProperty.SecondaryProperty);
    Assert.IsNull(myValue);
}

public class MyEntity {
    public AnotherEntity Property { get; set; }
}

public class AnotherEntity {
    public YetAnotherClass FirstProperty { get; set; }
}

public class YetAnotherClass {
    public object SecondaryProperty { get; set; }
}

调试或运行完成时都不会引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM