我有一个示例程序,需要按特定顺序执行3个方法。 并且在执行每个方法之后,应该进行错误处理。现在我以正常的方式做到这一点,没有使用这样的代表。
课程计划 { public static void 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;
}
}
正如你所看到的,这段代码看起来很丑陋,有很多尝试catch循环,它们都做同样的事情......所以我决定我可以使用委托来重构这段代码,以便Try Catch可以全部推送一个方法,使它看起来整洁。我在网上看了一些例子,无法想象我们是否会为此使用Action或Func代表。两者看起来相似,但我无法清楚地知道如何实现这一点。任何帮助都非常感谢。我正在使用.NET 4.0,所以我允许使用匿名方法n lambda表达式也用于此
由于
答案 0 :(得分: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;
}
}
就像另一个答案所说的那样,对于这个简单的例子来说,这可能是过度的。但是在某些情况下它仍然有用,例如,如果你想在每一步都实现一些重试逻辑(假设你做的事情比计算值更复杂)
答案 1 :(得分:-1)
感谢您的回复......我能够提出这个解决方案
@joel .... thnx for soln ...正如你所看到的,抛出的excpetion无法终止程序....它在记录异常后继续shud ... 这是我的代码 不知何故,我觉得这可以/ shud进一步重构。!!我只是不知道如何:(
任何进一步简化此事的建议......
注意:如果某个特定函数抛出一个异常,整个结果就会出错......但是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();
}
}