我应该在自定义异常中为可重试属性建模吗?

时间:2016-03-12 03:51:20

标签: java c# exception exception-handling

我正在创建一些自定义异常,并想知道我是否应该在异常中建模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世界的任何地方被使用过,所以不确定这是否是正确的方法。

请提供意见。

1 个答案:

答案 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.

        }
    }