我是否应该在自定义异常中对可重试属性进行建模



我正在创建一些自定义异常,想知道我是否应该在异常中对 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.
        }
    }

最新更新