我正在创建一些自定义异常,想知道我是否应该在异常中对 isRetry 属性进行建模?由客户端决定是否要重试,即使该属性设置为 true。
例如,像NetworkConnectionInterruptedException,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世界的任何地方使用,所以不确定这是否是正确的方法。
请就此发表意见。
我有用...是的,您描述的是一个很好的模式,让呼叫者决定何时退出。
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.
}
}