C#反射问题,Invoke调用的方法异常处理

zdqa123456 2013-01-22 11:00:29

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

private void Form1_Load(object sender, EventArgs e)
{
Test1 test = new Test1();
foreach (var item in test.GetType().GetMethods())
{
try
{
item.Invoke(test, null);
}
catch (Exception)
{
MessageBox.Show("捕获异常");
}
}

}
public class Test1
{
public void method1()
{
throw new Exception("有异常");
}

public void method2()
{
throw new NotImplementedException();
}
}
}

如上所述:我想捕获到Invoke所调用的方法的异常。
如果直接try catch是无法捕获到异常,异常抛出到托管代码那边去了。
求哪位大神看看,给点提示。感激不尽!
...全文
907 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdqa123456 2013-01-22
  • 打赏
  • 举报
回复
老实说,真没面子,这问题早该发现了。。。我知道是什么问题了。 框架的库是3.5版本的,我调用接口的是4.0版本的,异常抛了两次。
zdqa123456 2013-01-22
  • 打赏
  • 举报
回复
引用 3 楼 wangchengh 的回复:
因为Invoke调用函数好比是你在一个新的线程上执行函数。所以函数内的异常会先抛到运行时,然后才是你Invoke的层,然而你没有捕获运行时异常,故程序会崩溃,那你Invoke的catch就没机会继续捕获异常了,要解决你的这个问题也很简单。 找到Program.cs文件,捕获运行时异常,修改成如下即可。你就能看到异常捕获的顺序了。 [STAThread] ……
这个方法之前试过了,捕获不到,内网的机器很奇怪。。我自己的笔记本写了同样结构的代码,可以捕获。如果没法模拟出内网的的情况,在这上面讨论也没什么意义了,大家都不知道我碰到的是什么问题。。。
wangchengh 2013-01-22
  • 打赏
  • 举报
回复
因为Invoke调用函数好比是你在一个新的线程上执行函数。所以函数内的异常会先抛到运行时,然后才是你Invoke的层,然而你没有捕获运行时异常,故程序会崩溃,那你Invoke的catch就没机会继续捕获异常了,要解决你的这个问题也很简单。 找到Program.cs文件,捕获运行时异常,修改成如下即可。你就能看到异常捕获的顺序了。 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); Application.Run(new Form1()); } private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { }
zdqa123456 2013-01-22
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
试了你的代码,可以捕获到异常,没有到托管代码里啊
谢谢关注,非常抱歉,上面的代码是我的临时打出来的,我现在努力模拟出我目前的框架代码。是有一层接口和反射的。。等下再更新
gxingmin 2013-01-22
  • 打赏
  • 举报
回复
试了你的代码,可以捕获到异常,没有到托管代码里啊

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧