浏览网在C#中更好的故障处理,我已经遇到一些以下,以实施策略。第一个是自然的我,而其他实现我不确定什么它的优点是?

1)

static void Fault(Action protectedBlock, Action faultHandler)
{ 
    try
    {
        protectedBlock();
    }
    catch
    {
        faultHandler();
        throw;
    }
}

2)

static Action Fault(Action protectedBlock, Action faultHandler)
{
    return () =>
    {
        try
        {
            protectedBlock();
        }
        catch
        {
            faultHandler();
            throw;
        }
    };
}

在C#显影高阶函数时是2)的优选策略?

和,我想知道,如果一种方法是比另一个更有效。

有帮助吗?

解决方案

在第二种情况下是像Faultable行动厂。当你在你想做的事情,protectedBlock什么代表,以及当发生Exception做什么,faultHandler委托传递。该行动将返回包裹在一个try / catch结构作为骨料Action。我用这两种方法的问题是实际上是被抓到没有Exception所以谁曾会赶上你扔有其行事的任何信息。

在2之间执行的差别是当他们实际执行。当它被称为第一次将被执行。每当返回Action被称为第二个将被执行。我不认为效率差别是显著。

其他提示

(2)可以进一步由,而(1)刚运行。但既不是完全“功能”作为Action不是(与Func<A, R>比较)。

的函数

因此,与(2)你可以这样做:

Fault(someAction, Fault(firstTryFaultHandler, lastDitchFaultHandler))();

...并获得预期的行为。不工作与(1)

在C#,方法2可被混淆。呼叫者可以使用 “故障(A,B);”期待和可能B到被调用。相反,一个lambda创建,返回并丢弃。换句话说什么都不做。

关于效率,方法2是有点浪费如果大多数的呼叫的形式为“故障(A,B)();”,即在调用拉姆达立即。在这种情况下,你不需要一个lambda。

由于这些原因,我会如果需要延迟执行偏爱的方法1.,可以明确地引入一个拉姆达 “()=>故障(A,B)”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top