调用其他方法和处理异常的方法

时间:2014-01-29 16:30:59

标签: c# .net delegates try-catch .net-4.5

背景:

我编写了一个从Web服务调用多个方法的C#应用​​程序。从Main中的循环,某些类中的循环调用方法,依此类推。由于相同的原因,这些方法中的每一种都可能失败:

  • 连接超时
  • Web服务内部错误
  • 会话到期

如果这些方法中的任何一个失败,我只需要等待几秒钟(或调用登录方法),然后再次调用它们。

问题:

我不想为每个调用所有这些方法编写基本相同的try / catch块,所以我需要另一个通用方法,它可以调用所有其他方法而不考虑它的名称和参数,然后捕获一些常见的异常,必要时再次调用该方法,并返回值。

方法授权响铃,但我真的不知道如何解决这个问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

听起来你可能想要这样的东西:

private T CallWithRetries<T>(Func<T> call)
{
    // TODO: Work out number of retries, etc.
    for (int i = 0; i < 3; i++)
    {
        try
        {
            return call();
        }
        catch (FooException e)
        {
            // Determine whether or not to retry, log etc. If this is the
            // last iteration, just rethrow - or keep track of all the exceptions
            // so far and throw an AggregateException containing them.
        }
    }
    throw new InvalidOperationException("Shouldn't get here...");
}

然后:

// Or whatever you want to do...
int userId = CallWithRetries(() => webService.GetUserId(authentication));

对于任何不返回值的调用,您可以使用Action参数的类似方法。

答案 1 :(得分:1)

您可以创建如下方法:

private void CallWebMethod(Action methodToBeCalled)
{
    try 
    {           
        methodToBeCalled();
    }
    catch (Exception ex)
    {

        //Log exception
    }              
}

使用以下方法调用没有任何参数的方法:

CallWebMethod(someMethod);

使用参数调用方法:

CallWebMethod(() => someMethodWithArgument(args));