我正在创建一些自定义异常,并想知道我是否应该在异常中建模isRetryable属性?无论是否要重试,即使该属性设置为true,也取决于客户端。
例如,如果NetConnectInterruptedException,HttpTimeoutException,StaleConnectionException等异常,则客户端可以根据需要重试。
但是,永远不应尝试使用UnknownUserException,InvalidAccountState等异常来重试客户端。
因此包含此属性并在以前的情况下设置为true而在以后的情况下设置为false是否有意义? (如下所示)
public class NetworkConnectionInterruptedException extends Exception {
public boolean isRetryable() {
return true;
}
}
public class UnknownUserException extends Exception {
public boolean isRetryable() {
return false;
}
}
主要目的是让用户知道如果他愿意,他可以重试,虽然没有强制要求 - 另一种让他知道API中的手动文档的方法。
我还没有看到这在java世界的任何地方被使用过,所以不确定这是否是正确的方法。
请提供意见。
答案 0 :(得分:0)
这对我有用......是的,你描述的是一个很好的模式,让来电者决定何时退出。
public class MyClass
{
public void DoSomething()
{
var OKToStop = false;
var list = new List<OfSomething>();
list.RepeatUntil(data =>
{
OKToStop = data.Count > 200;
return OKToStop;
},exception => {
OKToStop = true;
LogException(exception);
});
}
private void LogException(Exception exception)
{
throw new NotImplementedException();
}
}
这是为了支持上面的代码...
public static class ExtensionMethods
{
public static List<OfSomething> RepeatUntil(this List<OfSomething> list, Func<List<OfSomething>, bool> Until, Action<Exception> Error)
{
try {
var ok = Until(list);
while (!ok){
list = GetNewData();
ok = Until(list);
}
}
catch (Exception iox) {
Error(iox);
}
return list;
}
private static List<OfSomething> GetNewData()
{
//Add new data or get new data or change something
return RefreshData();
}
private static List<OfSomething> RefreshData()
{
//get data from DB here etc.
}
}