自定义错误信号的条件行为

时间:2012-02-08 20:50:39

标签: c# .net error-handling

我正在开发一个.NET项目,团队决定回避Exceptions的惯例,转而使用自定义错误信号。在实践中,这个概念运作得很好,除了有一个令人讨厌的副作用:我发现自己在决定是否继续之前不断检查中间错误代码:

var error = DoSomething();

if( !error.Success )
    return error;

return DoSomethingElse();

我想做的事情如下:

DoSomething().ReturnIfError();
return DoSomethingElse();

我知道一些语言如Ruby支持'return if'构造 - 在C#中有没有这样的东西,或者在扩展方法中是否可以这样做?

2 个答案:

答案 0 :(得分:0)

这不是可以通过扩展方法巧妙地入侵的东西。

在你给出的第二个例子中(用理论方法链接),你会......

  • 致电DoSomething
  • 如果DoSomething出错,请致电ReturnIfError
  • 然后致电DoSomethingElse

您需要使用return关键字尽早摆脱方法块。

假设这是你真正想做的事情,那么以下代码可以实现这一点(不是我推荐它!)。

using System;

namespace ConsoleApplication6
{
    public static class ClassUtility
    {
        public static void CallOnError<TIn>(this TIn value, Func<TIn, bool> fn, Action<TIn> errorFn)
            where TIn : class
        {
            if (!fn(value))
            {
                errorFn(value);
            }
        }
    }

    public class TestClass
    {
        public bool FirstCall(bool value)
        {
            Console.WriteLine("First call.");
            return value;
        }

        public void SecondCall()
        {
            Console.WriteLine("Second call.");
        }

        public void ThirdCall()
        {
            Console.WriteLine("Third call.");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var testClass = new TestClass();

            testClass.CallOnError(tc => tc.FirstCall(false),
                                  tc2 => tc2.SecondCall());

            testClass.CallOnError(tc => tc.FirstCall(true),
                                  tc2 => tc2.SecondCall());

            testClass.ThirdCall();

            Console.ReadLine();
        }
    }
}

答案 1 :(得分:-1)

执行一个通用类来检查错误并在整个代码中调用该类或静态方法。