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

