C#异常执行重试的实现方法

一 模式介绍

重试模式,是应用在异常处理中,发生异常的时候,能够对业务程序进行重新调用,在实际中,可以使用Polly提供稳定,简单的用法,自己实现主要是对模式的一种了解。

二 模式实现

public class RetryPattern
    {
        /**
         * 重试模式可以用Polly替代
         * 自己实现一种模式
         */

        #region 构造函数

        public RetryPattern()
        {
        }

        #endregion 构造函数

        #region 变量

        private uint MaxTryCount; // 最大重试次数
        private uint CurrentTryCount; // 当前重试的次数
        private bool RunResult = true; // 执行结果

        #endregion 变量

        #region 方法

        #region 设置最大重试次数

        public void SetMaxCount(uint tryCount)
        {
            // 校验
            if (tryCount == 0) throw new ArgumentException("重试次数不能为0");

            MaxTryCount = tryCount;
        }

        #endregion 设置最大重试次数

        #region 是否需要重试

        public bool IsRetry()
        {
            if (RunResult || CurrentTryCount == MaxTryCount)
                return false;
            else
            {
                RunResult = true;
                return true;
            }
        }

        #endregion 是否需要重试

        #region 获取当前重试次数

        public uint GetCurrentTryCount()
        {
            return CurrentTryCount + 1;
        }

        #endregion 获取当前重试次数

        #region 重试

        public void RetryHandle()
        {
            RunResult = false;
            CurrentTryCount++;
        }

        #endregion 重试

        #endregion 方法
    }

ps:下面通过代码看下C# 异常重试策略

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Polly;
using Polly.Bulkhead;
using Polly.CircuitBreaker;
using Polly.Fallback;
using Polly.NoOp;
using Polly.Registry;
using Polly.Retry;
using Polly.Timeout;
using Polly.Utilities;
using Polly.Wrap;
using System.Net.Http;

namespace CircuitBreak_Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            try
            {
                var retryTwoTimesPolicy =
                     Policy
                         .Handle<DivideByZeroException>()
                         .Retry(3, (ex, count) =>
                         {
                             Console.WriteLine("执行失败! 重试次数 {0}", count);
                             Console.WriteLine("异常来自 {0}", ex.GetType().Name);
                         });
                retryTwoTimesPolicy.Execute(() =>
                {
                    Compute();
                });
            }
            catch (DivideByZeroException e1)
            {
                Console.WriteLine($"Excuted Failed,Message: ({e1.Message})");

            }

            Policy policy = Policy.Handle<TimeoutException>()
               .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(5), (exception, retryCount) =>
               {
                   //logger.Error(exception);
                   string xx = "";
               });

            var result = policy.ExecuteAsync(() => Test());

            Policy _circuitBreakerPolicy = Policy
                .Handle<HttpRequestException>()
                .Or<TimeoutRejectedException>()
                .Or<TimeoutException>()
                .CircuitBreakerAsync(
                    exceptionsAllowedBeforeBreaking: 5,
                    durationOfBreak: new TimeSpan(),
                    onBreak: (ex, breakDelay) =>
                    {

                    },
                    onReset: () => { },
                    onHalfOpen: () => { }
                    );

            var fallBackPolicy =
               Policy<string>
                   .Handle<Exception>()
                   .Fallback("执行失败,返回Fallback");

            var fallBack = fallBackPolicy.Execute(() =>
            {
                throw new Exception();
            });
            Console.WriteLine(fallBack);

        }

        static int Compute()
        {
            var a = 0;
            return 1 / a;
        }

        private static async Task Test()
        {
            using (HttpClient httpClient = new HttpClient())
            {
                var response = httpClient.GetAsync("http://news1.cnblogs.com/Category/GetCategoryList?bigCateId=11&loadType=0").Result;
                await response.Content.ReadAsStringAsync();
            }
        }
    }
}

到此这篇关于C#异常执行重试的一种实现方法的文章就介绍到这了,更多相关C#异常重试内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C#编程中异常的创建和引发以及异常处理

    创建和引发异常 异常用于指示在运行程序时发生了错误.此时将创建一个描述错误的异常对象,然后使用 throw 关键字"引发"该对象.然后运行时搜索最兼容的异常处理程序. 当存在下列一种或多种情况时,程序员应引发异常: 方法无法完成其中定义的功能. 例如,如果方法的参数具有无效值: static void CopyObject(SampleClass original) { if (original == null) { throw new System.ArgumentException

  • C#解决SQlite并发异常问题的方法(使用读写锁)

    本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题. SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写.Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用.但在C#中未提供类似功能. 作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标. using System; usin

  • C#异常捕获机制图文详解

    异常捕获机制 C# 1.示意图 2.异常捕获机制,代码: 3.异常捕获机制,结果: 4.求几周,剩余几天?代码: 5.结果: 6.求几月几周零几天 设一个月30天 代码: 7.结果:

  • 学会使用C#异常

    在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为"异常".异常通常由错误的代码引发,并由能够更正错误的代码进行 catch.异常可由 .NET 的 CLR 或由程序中的代码引发.一旦引发了异常,这个异常将会在调用堆栈中一直向上进行传播,直到寻找到跟它匹配的 catch 语句.没有 catch 的异常会由系统提供的默认的异常处理程序进行处理,也就是你经常看到的一个突然造成调试中断并显示异常信息的对话框. 所有的异常,它们都是从 Exception 派生出来的.

  • C#程序异常关闭时的捕获

    本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志. 概述 有时在界面的事件中,明明有try... catch 进行捕获异常,但是还是会有异常关闭的情况,所以在程序中如何最终的记录一些无法捕获的异常,会大大方便问题的定位分析及程序优化. 涉及知识点 以下两个异常事件,主要应用不同的场景. Application.ThreadException 在发生应用程序UI主线程中未捕获线程异常时发生,触发的事件. AppDomain.CurrentDomain.U

  • C#异常处理的技巧和方法

    c#中或多或少回出现一些意向不道的异常,那么如何去捕获这个异常就非常的关键--这个异常可能是系统的不可控因素也有可能是程序本身才一个异常.下面就具体的解决方案提供给大家,希望有所帮助 从最常见的分母为0的情况的实例 通过try catch finally三个关键字的一个语法结构图.finally是监听程序是否在try或者catch中执行 下面列举的是try执行的语句是一个异常错误的情况 下面列举的是try执行语句是一个正确的情况 异常类的一个继承顺序图,异常类中的属性列表 catch中的表达式的

  • C#异常执行重试的实现方法

    一 模式介绍 重试模式,是应用在异常处理中,发生异常的时候,能够对业务程序进行重新调用,在实际中,可以使用Polly提供稳定,简单的用法,自己实现主要是对模式的一种了解. 二 模式实现 public class RetryPattern { /** * 重试模式可以用Polly替代 * 自己实现一种模式 */ #region 构造函数 public RetryPattern() { } #endregion 构造函数 #region 变量 private uint MaxTryCount; //

  • python3模拟实现xshell远程执行liunx命令的方法

    依赖包:pip install paramiko 源码demo: from time import * import paramiko # 定义一个类,表示一台远端linux主机 class Linux(object): # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机 def __init__(self, ip, username, password, timeout=30): self.ip = ip self.username = username self.passwo

  • python中可以发生异常自动重试库retrying

    目录 1.前言 2.快速开始 2.1.安装retrying 2.2.模拟无限重试 2.3.模拟最大重试次数 2.4.模拟最大重试时间 2.5.模拟重试间隔时间 2.6.指定重试调用的方法 2.7.指定重试的异常类型 2.8.指定重试的特定条件 1.前言 在我们日常的开发工作中,为了代码的健壮性,我们通常会对方法中的业务代码进行try-except的包装,以防止在发生异常的时候进程被中断.如果发生异常,我们该怎么办呢?有同学可能用自己的方式(循环)去做了重试,那么有没有一种通用的可靠的重试方式呢?

  • Android Force Close 出现的异常原因分析及解决方法

    一.原因: forceclose,意为强行关闭,当前应用程序发生了冲突. NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常 二.如何避免 如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtExcepti

  • C#动态执行批处理命令的方法

    本文实例讲述了C#动态执行批处理命令的方法.分享给大家供大家参考.具体方法如下: C# 动态执行一系列控制台命令,并允许实时显示出来执行结果时,可以使用下面的函数.可以达到的效果为: 持续的输入:控制台可以持续使用输入流写入后续的命令 大数据量的输出:不会因为大数据量的输出导致程序阻塞 友好的 API:直接输入需要执行的命令字符串即可 函数原型为: 复制代码 代码如下: /// <summary> /// 打开控制台执行拼接完成的批处理命令字符串 /// </summary> //

  • Java实现调用jython执行python文件的方法

    本文实例讲述了Java实现调用jython执行python文件的方法.分享给大家供大家参考,具体如下: 在web开发时候,经常在web环境使用本地环境的第三方库什么的,本文讲解java如何执行python文件. 网上说方法有三种,其实也就两种,下面着中介绍第二种通过(jython). 方法一 java.lang.Runtime Runtime rt = Runtime.getRuntime(); try { Process proc = rt.exec("python /tmp/test.py&

  • 原生JS实现DOM加载完成马上执行JS代码的方法

    用原生JS我们经常使用window.onload事件来加载页面.但是window.onload是在页面元素都加载完毕后才执行,如果页面内有大的图片的话,会在页面展现后好久时间后才执行.所以有时我们需要在DOM载入时马上执行一些函数.jQuery提供了document.ready方法用来代替window.onload.但又不愿意仅为了这一个需求而引入整个JQuery库,于是就把jQuery的方法提取出来,单独使用了. 如果只需要对DOM进行操作,那么这时就没必要等到页面全部加载了.Firefox有

  • axios对请求各种异常情况处理的封装方法

    前端采用了axios来处理网络请求,为了避免在每次请求时都去判断各种各样的网络情况,比如连接超时.服务器内部错误.权限不足等等不一而足,我对axios进行了简单的封装,这里主要使用了axios中的拦截器功能. 封装后的网络请求工具js如下 import axios from 'axios' import { Toast } from 'mint-ui' //请求时的拦截 axios.interceptors.request.use(config => { return config; }, er

  • Java异常类型介绍及处理方法

    前言: Java异常,大家都很熟悉.但是对于具体怎么分类的,JVM对其怎么处理的,代码中怎么处理的,应该怎么使用,底层怎么实现的等等,可能就会有些不是那么清晰.本文基于此详细捋一下异常类型,实现以及使用时应怎么注意. 一.异常实现及分类 先看下异常类的结构图 上图可以简单展示一下异常类实现结构图,当然上图不是所有的异常,用户自己也可以自定义异常实现.上图已经足够帮我们解释和理解异常实现了: 1.所有的异常都是从Throwable继承而来的,是所有异常的共同祖先. 2.Throwable有两个子类

  • JS中异常抛出和处理方法图文详解

    目录 抛出异常 抛出的表达式类型 基本数据类型 对象 类的实例对象 Error 类的实例对象 Error 的子类 处理异常 js中常见的系统异常: 总结 抛出异常 在 js 中,有时候我们需要处理一些异常或错误.比如编写的某个函数所接收的参数要求是 Number 类型的,如果在该函数被调用时传入的是字符串,就需要发出提醒.此时我们可以使用 throw 语句来抛出个异常: // 例 1 function fn(num) { if (typeof num !== 'number') throw '需

随机推荐