Просмотр исходного кода

Add two-exception-type overloads to ResilientUtils

Agent-Logs-Url: https://github.com/Meloong-Git/MeloongCore/sessions/e3c21784-1e8f-4a30-920e-5dad98923d73

Co-authored-by: LTCatt <[email protected]>
copilot-swe-agent[bot] 5 месяцев назад
Родитель
Сommit
abc020ca0f
1 измененных файлов с 25 добавлено и 0 удалено
  1. 25 0
      Shared/Utils/ResilientUtils.cs

+ 25 - 0
Shared/Utils/ResilientUtils.cs

@@ -11,6 +11,11 @@ public static class ResilientUtils {
     /// </summary>
     public static void RetryOn<TException>(Action action, int maxAttempts = 2, int delayMs = 200, [CallerMemberName] string caller = "") where TException : Exception 
         => RetryOn<TException, object?>(() => { action(); return null; }, maxAttempts, delayMs, caller);
+    /// <summary>
+    /// 在抛出特定异常时,延迟并自动重试。
+    /// </summary>
+    public static void RetryOn<TException1, TException2>(Action action, int maxAttempts = 2, int delayMs = 200, [CallerMemberName] string caller = "") where TException1 : Exception where TException2 : Exception
+        => RetryOn<TException1, TException2, object?>(() => { action(); return null; }, maxAttempts, delayMs, caller);
 
     /// <summary>
     /// 在抛出任意异常时,延迟并自动重试。
@@ -37,5 +42,25 @@ public static class ResilientUtils {
             }
         }
     }
+    /// <summary>
+    /// 在抛出特定异常时,延迟并自动重试。
+    /// </summary>
+    public static TOut RetryOn<TException1, TException2, TOut>(Func<TOut> func, int maxAttempts = 2, int delayMs = 200, [CallerMemberName] string caller = "") where TException1 : Exception where TException2 : Exception {
+        int attempt = 0;
+        while (true) {
+            try {
+                return func(); // 成功则退出
+            } catch (Exception ex) when (ex is TException1 or TException2) {
+                attempt++;
+                if (attempt < maxAttempts) {
+                    Logger.Warn(ex, $"第 {attempt} 次 {caller} 尝试失败,将在 {delayMs}ms 后重试");
+                    Thread.Sleep(delayMs);
+                } else { // 超过最大尝试次数
+                    Logger.Warn(ex, $"第 {attempt} 次 {caller} 尝试失败,已到达最大尝试次数");
+                    throw;
+                }
+            }
+        }
+    }
 
 }