C# 当方法报错时,则重新执行此方法,如何解决
要求是:
当执行方法时如果报错,则提示是否重新执行,如果是,则再次执行此方法!
我现在这里有几十个需要此需求的方法,我不想一个个去改(Goto 或者重新调用自己)!求大神帮忙,写一个一劳永逸的方法
------解决思路---------------------- try...catch中提示,如果不执行,return
------解决思路----------------------
bool hasError = false;
try{
hasError =false;
}catch(Exception ex){
hasError =true;
}finally{
if(hasError){
// 执行方法。
}
}
------解决思路---------------------- 要么goto,要么递归,要么while
总之你得加点代码
你不在方法体里面改,就得每个调用方法的地方去改,那更麻烦
把你那几十个方法改了才是一劳永逸的方法
------解决思路---------------------- 引用:
bool hasError = false;
try{
hasError =false;
}catch(Exception ex){
hasError =true;
}finally{
if(hasError){
// 执行方法。
}
}
如果一直报错,那不是死循环了,应该加for限制次数
------解决思路---------------------- 我想楼主的意思是 有没有一个地方可以捕捉到这些方法抛出的异常,然后根据异常信息或者调用堆栈,然后重新执行报错的方法吧
------解决思路---------------------- 引用: Quote: 引用:
我想楼主的意思是 有没有一个地方可以捕捉到这些方法抛出的异常,然后根据异常信息或者调用堆栈,然后重新执行报错的方法吧
用try Catch/GOTO/递归/循环等等方法,我都知道,但是我不想每一个方法,都这样写一遍(我这里近百个方法,都这样写,我得疯)!感觉又麻烦又傻!
只要方便,尽量少写代码,能实现我效果就可以
那你就把调用函数的地方改了,不能直接调用,而是通过函数名反射调用,把函数名字符串传进来,判断是否有异常,有异常就重新调用
不过这样改的地方其实也超多,你每一个调用函数的地方都需要改
------解决思路---------------------- 除非你现在是只定义好了近百个函数,还没开始真正调用,这样你只定义一个函数去通过函数名调用这近百个方法就好了
否则你在函数里改比在调用函数的地方改其实改动的地方还少一些
------解决思路---------------------- 用这个Polly吧:https://github.com/michael-wolfenden/Polly
------解决思路----------------------
给你个思路,下面是运行通过的
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;
}
}
}
------解决思路---------------------- 有你们说的那难吗?
简单的实现:
try
{
//方法A
}
catch
{
try
{
//方法A
}
catch(Exception ex){MessageBox.Show(ex.message);}
}
------解决思路---------------------- 如果不想动方法本身,那么就需要在外部调用方法的时候做异常处理,你可以写一个基类集成Exception,也可以在程序入口处放置异常捕获(只能捕获到托管异常)。在异常中通过反射,重新调用抛出异常的方法,直到该方法没有再抛出异常。
稍后给你个demo
------解决思路---------------------- 引用: 以上的方法感觉还是不行
是Winform程序?
------解决思路----------------------
//主方法
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;
}
}