要求是: |
|
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; } } |
没找到什么简单的方法,都挺麻烦的
|