有时候我们在项目中碰到,比如这样那样的原因(网络或者是其他的原因)导致方法调用失败,大部分的方法是在触发一次方法调用,其实我们可以通过自定义Exception,然后提供调用的方法名称和参数等等,提供一种自动的重试多次的机制。
其实方法是很简单的,我们先自定义一个Exception
代码如下
public class RetryException : Exception
{
private int RetryTimes;
private string MethodName;
private object[] Values;
private Type ClassType;
public RetryException(int retryTimes, Type classType, string method, params object[] values)
{
RetryTimes = retryTimes;
MethodName = method;
Values = values;
ClassType = classType;
RetryMethod();
}
public RetryException(string message, int retryTimes, Type classType, string method, params object[] values)
: base(message)
{
RetryTimes = retryTimes;
MethodName = method;
ClassType = classType;
Values = values;
RetryMethod();
}
public RetryException(string message, Exception innerException, int retryTimes, Type classType, string method, params object[] values)
: base(message, innerException)
{
RetryTimes = retryTimes;
MethodName = method;
ClassType = classType;
Values = values;
RetryMethod();
}
private void RetryMethod()
{
if (string.IsNullOrEmpty(MethodName))
throw new Exception("method 为空");
if (RetryTimes == 0)
throw new Exception("重试次数为空");
if (ClassType == null)
throw new Exception("ClassType为空");
object instance = Activator.CreateInstance(ClassType);
MethodInfo Method = ClassType.GetMethod(MethodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public);
do
{
try
{
Method.Invoke(instance, Values);
}
catch (Exception ex)
{
if (RetryTimes > 1)
{
System.Threading.Thread.Sleep(1000);
}
else
{
throw ex;
}
}
RetryTimes--;
} while (RetryTimes > 0);
}
}
使用方法 我们先定义一个简单的方法如下
public class service
{
public void GetName(string message,object obj)
{
if (message == "error")
throw new Exception(" message");
}
}
调用的方法是
service sv = new service();
object obj = new object();
try
{
sv.GetName("error",obj);
}
catch (Exception ex)
{
new RetryException(5, typeof(service), "GetName", new object[] {"error",obj});
}