0

我有一个示例程序,它需要按特定顺序执行 3 个方法。并且在执行每个方法之后,都应该做错误处理。现在我以正常的方式做到了这一点,没有使用这样的代表。

类程序 { 公共静态无效 Main() {

        MyTest();
    }

    private static bool MyTest()
    {

        bool result = true;
        int m = 2;
        int temp = 0;

        try
        {
            temp = Function1(m);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for function1" + e.Message);
            result = false;
        }

        try
        {
            Function2(temp);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for function2" + e.Message);
            result = false;
        }

        try
        {
            Function3(temp);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for function3" + e.Message);
            result = false;
        }

        return result;
    }

    public static int Function1(int x)
    {
        Console.WriteLine("Sum is calculated");
        return x + x;
    }

    public static int Function2(int x)
    {
        Console.WriteLine("Difference is calculated ");
        return (x - x);
    }

    public static int Function3(int x)
    {
        return x * x;
    }
}

正如你所看到的,这段代码看起来很难看,有这么多的 try catch 循环,它们都在做同样的事情......所以我决定我可以使用委托来重构这段代码,以便可以将 Try Catch 全部推到一个方法中使它看起来整洁。我正在网上查看一些示例,但无法确定我是否应该为此使用 Action 或 Func 代表。两者看起来相似,但我无法清楚地知道如何实现这一点。非常感谢任何帮助。我正在使用 .NET 4.0,因此我也允许为此使用匿名方法 n lambda 表达式

谢谢

4

2 回答 2

4
bool result = true;
int m = 2;
int temp = 0;

var funcs = new Func<int, int>[]{
                          x =>
                              {
                                  Console.WriteLine("Sum is calculated");
                                  return x + x;
                              },
                          x =>
                              {
                                  Console.WriteLine("Difference is calculated");
                                  return x - x;
                              },
                          x => x * x
                      };

temp = m;
foreach (var func in funcs)
{
    try
    {
        temp = func(m);
    }
    catch (Exception e)
    {
        Console.WriteLine("Caught exception:" + e.Message);
        result = false;
    }                
 }

就像另一个答案说的那样,对于这个简单的例子来说,这可能是多余的。但是在某些情况下它仍然有用,例如,如果您想在每个步骤中实现一些重试逻辑(假设您正在做一些比计算值更复杂的事情)

于 2010-05-02T00:42:36.977 回答
-1

感谢您的回复...我能够想出这个解决方案

@joel ....thnx for the soln ...如您所见,抛出的异常无法终止程序....在记录异常后它会继续..这是我的代码我仍然不知何故,觉得这可以/shud 被进一步重构。!!我只是不知道如何:(

任何进一步简化此的建议..

注意:如果一个特定的函数抛出异常,整体结果应该是错误的......但是应该继续执行其他函数以查看是否有任何其他函数失败......

另外,这里提到的func只是为了说明,实际的方法更多的是cmplx

class Program
{
    public static void Main()
    {
        ExecuteTask task1 = Function1;
        ExecuteTask task2 = Function2;
        ExecuteTask task3 = Function3;
        bool result = true;
        int param1 = 2, param2 = 3, param3 = 4;

        MyTest(task1, ref result, ref param1);
        MyTest(task2, ref result, ref param2);
        MyTest(task3, ref result, ref param3);

        Console.WriteLine("final result is " + result.ToString());
        Console.ReadLine();
    }

    private delegate void ExecuteTask(ref int x);

    private static void MyTest(ExecuteTask task, ref bool result1, ref int param1)
    {

        try
        {
            task(ref param1);
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception for " + e.Message);
            result1 = false;
        }

        return result1;
    }

    public static void Function1(ref int x)
    {
        Console.WriteLine("Sum is calculated");
        x = x + x;
    }

    public static void Function2(ref int x)
    {
        Console.WriteLine("Difference is calculated ");
        x = (2 * x - x);
    }

    public static void Function3(ref int x)
    {
        //Console.WriteLine("Product is calculated ");
        //x = x * x;
        throw new ArgumentOutOfRangeException();
    }
}
于 2010-05-02T21:10:27.120 回答