C# 当方法报错时,如何重新执行此方法

.Net技术 码拜 10年前 (2015-03-15) 2209次浏览 0个评论
 

要求是:
当执行方法时如果报错,则提示是否重新执行,如果是,则再次执行此方法!
我现在这里有几十个需要此需求的方法,我不想一个个去改(Goto 或者重新调用自己)!求帮忙

C# 当方法报错时,如何重新执行此方法
3分
try…catch中提示,如果不执行,return
C# 当方法报错时,如何重新执行此方法
3分
ool  hasError = false;
try{
    hasError =false;
}catch(Exception ex){
     hasError =true;
}finally{
   if(hasError){
       // 执行方法。
    }
}
/pre>
C# 当方法报错时,如何重新执行此方法
3分
要么goto,要么递归,要么while
总之你得加点代码
你不在方法体里面改,就得每个调用方法的地方去改,那更麻烦
把你那几十个方法改了才是一劳永逸的方法
C# 当方法报错时,如何重新执行此方法
3分
引用 2 楼 duanzi_peng 的回复:
ool  hasError = false;
try{
    hasError =false;
}catch(Exception ex){
     hasError =true;
}finally{
   if(hasError){
       // 执行方法。
    }
}
/pre>

如果一直报错,那不是死循环了,应该加for限制次数

C# 当方法报错时,如何重新执行此方法
3分
我想楼主的意思是  有没有一个地方可以捕捉到这些方法抛出的异常,然后根据异常信息或者调用堆栈,然后重新执行报错的方法吧
C# 当方法报错时,如何重新执行此方法
引用 5 楼 huoda2008523 的回复:

我想楼主的意思是  有没有一个地方可以捕捉到这些方法抛出的异常,然后根据异常信息或者调用堆栈,然后重新执行报错的方法吧

用try Catch/GOTO/递归/循环等等方法,我都知道,但是我不想每一个方法,都这样写一遍(我这里近百个方法,都这样写,我得疯)!感觉又麻烦又傻!
只要方便,尽量少写代码,能实现我效果就可以

C# 当方法报错时,如何重新执行此方法
3分
引用 6 楼 bjf814 的回复:
Quote: 引用 5 楼 huoda2008523 的回复:

我想楼主的意思是  有没有一个地方可以捕捉到这些方法抛出的异常,然后根据异常信息或者调用堆栈,然后重新执行报错的方法吧

用try Catch/GOTO/递归/循环等等方法,我都知道,但是我不想每一个方法,都这样写一遍(我这里近百个方法,都这样写,我得疯)!感觉又麻烦又傻!
只要方便,尽量少写代码,能实现我效果就可以

那你就把调用函数的地方改了,不能直接调用,而是通过函数名反射调用,把函数名字符串传进来,判断是否有异常,有异常就重新调用
不过这样改的地方其实也超多,你每一个调用函数的地方都需要改

C# 当方法报错时,如何重新执行此方法
3分
除非你现在是只定义好了近百个函数,还没开始真正调用,这样你只定义一个函数去通过函数名调用这近百个方法就好了
否则你在函数里改比在调用函数的地方改其实改动的地方还少一些
C# 当方法报错时,如何重新执行此方法
3分
用这个Polly吧:https://github.com/michael-wolfenden/Polly
C# 当方法报错时,如何重新执行此方法
4分
给你个思路,下面是运行通过的
img src=”http://img.bbs.csdn.net/upload/201412/16/1418718691_194394.png” alt=””>
pre class=”brush: csharp”>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate dynamic MethodHandle(params object[] p);
        /// <summary>
        /// 调用案例1
        /// </summary>
        /// <param name=”sender”></param>
        /// <param name=”e”></param>
        private void button1_Click(object sender, EventArgs e)
        {
            int id = 3;
            ExecMethod((pid) => { return People.GetName(Convert.ToInt32(pid[0])); }, id);
        }
        /// <summary>
        /// 调用案例2
        /// </summary>
        /// <param name=”sender”></param>
        /// <param name=”e”></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string name = “dog”;
            ExecMethod((_name) => { People2.SetName((_name[0]).ToString()); return null; }, name);
        }
        /// <summary>
        /// 实现思路
        /// </summary>
        /// <param name=”m”></param>
        /// <param name=”p”></param>
        /// <returns></returns>
        public dynamic ExecMethod(MethodHandle m, params object[] p)
        {            
            try
            {
               dynamic res = m(p);
               return res;
            }
            catch (Exception ex)
            {
                ExecMethod(m, p);
            }
            return null;
        }
    }
    /// <summary>
    /// 测试类1 带返回值 带参数
    /// </summary>
    public class People
    {
        public static string GetName(int id)
        {
            return (id * id).ToString();
        }
    }
    /// <summary>
    /// 测试类2 不带返回值 带参数
    /// </summary>
    public class People2
    {
        private static string Name { get; set; }
        public static void SetName(string name)
        {
            Name = name;
        }
    }
}
/pre>
C# 当方法报错时,如何重新执行此方法
3分
有你们说的那难吗?
简单的实现:
pre class=”brush: csharp”>
try
{
    //方法A
}
catch
{
 try
    {
        //方法A
    }
    catch(Exception ex){MessageBox.Show(ex.message);}
}
/pre>
C# 当方法报错时,如何重新执行此方法
3分
如果不想动方法本身,那么就需要在外部调用方法的时候做异常处理,你可以写一个基类集成Exception,也可以在程序入口处放置异常捕获(只能捕获到托管异常)。在异常中通过反射,重新调用抛出异常的方法,直到该方法没有再抛出异常。
稍后给你个demo
C# 当方法报错时,如何重新执行此方法
3分
//主方法
int i;
try
{
    i = new TestClass().GetValue(0);  //传入0,异常了
}
catch (Exception ex)
{
     //这里调用一下自己为Exception写的扩展方法,并传入一个不会出现异常的值,实际上根据你的需求
    object obj = ex.InvokeExceptionMethod(new object[] { 1 });   
    i = int.Parse(obj.ToString());
}
//可能会出现异常的方法
public class TestClass
{
    public int GetValue(int i)
    {
        return 1 / i;
    }
}
//Exception的扩展方法
    public static class ExtensionsFunction
    {
        public static object InvokeExceptionMethod(this Exception ex, object[] parameters)
        {
            //ex.TargetSite.DeclaringType是异常来源的类
            if (ex.TargetSite.DeclaringType != null)
            {
                //ex.TargetSite.Name是捕获异常的方法
                MethodInfo mi = ex.TargetSite.DeclaringType.GetMethod(ex.TargetSite.Name);
                //通过反射直行方法,并传入参数
                return mi.Invoke(Activator.CreateInstance(ex.TargetSite.DeclaringType), parameters);
            }
            return null;
        }
    }
C# 当方法报错时,如何重新执行此方法
没找到什么简单的方法,都挺麻烦的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 当方法报错时,如何重新执行此方法
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!