Invoke、InvokeMember提示“调用的目标发生了异常”

cnwolfs 2011-12-10 05:17:14
本人使用软件三层架构,也就是有一个实体类Entity,数据层Data这种架构。由于要给PDA访问,因此建立了一个简易的中间件,中间件根据TCP接收回来的指令,使用反射的方法调用Entity和Data的各个方法。

现在遇到一个问题,Data中的异常无法反馈到中间件上,无论什么类型的错误,中间件总是得到引发“调用的目标发生了异常”的异常。

要知道,Data中的异常是不可避免的,例如数据库超时、安装时数据库配置错误等。唯有的办法是把异常反馈到前台,让用户能够看到是什么样的异常才好。
请问有何解决之道。

下付测试用的部分源码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ReflectionTestDll
{
public class Class1
{
public Class1()
{
}

public string MethodErr2(string pValues, string pValues1)
{
throw new Exception("MethodErr2 " + pValues + pValues1);
}
}
}




private void btnMethodErr2_Click(object sender, EventArgs e)
{
try
{
Assembly t = Assembly.Load("ReflectionTestDll");
Type a = t.GetType("ReflectionTestDll.Class1");

string[] bb = new string[] { "aaaa", "bbbbb" };
object obj = Activator.CreateInstance(a, bb);

MethodInfo mi = a.GetMethod("MethodErr2");
object[] aa = new string[] { "For Err ", "Method2" };
string s = (string)mi.Invoke(obj, aa); //带参数方法的调用
}
catch (Exception Ex)
{
//我希望这里能够获得异常,可是每次都是“调用的目标发生了异常”
}

this.txtMSG.Text = mSB.ToString();
}



...全文
1065 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
大海你就是水 2012-09-18
  • 打赏
  • 举报
回复
那个messge m是 大写。。
大海你就是水 2012-09-18
  • 打赏
  • 举报
回复
try
{
Assembly t = Assembly.Load("ReflectionTestDll");
Type a = t.GetType("ReflectionTestDll.Class1");

string[] bb = new string[] { "aaaa", "bbbbb" };
object obj = Activator.CreateInstance(a, bb);

MethodInfo mi = a.GetMethod("MethodErr2");
object[] aa = new string[] { "For Err ", "Method2" };
string s = (string)mi.Invoke(obj, aa); //带参数方法的调用
}
catch (Exception Ex)
{
MessageBox.Show(Ex.messge);
}

cnwolfs 2011-12-12
  • 打赏
  • 举报
回复
谢谢
InnerException 解决问题

阿非 2011-12-11
  • 打赏
  • 举报
回复
if (targetEx.InnerException != null)

这里有时的if 应该换成 while
阿非 2011-12-11
  • 打赏
  • 举报
回复

void fn(int n)
{
if (n >= 10)
return;
throw new ArgumentException("参数必须大于10");
}



Type type = typeof(Program);
object instance = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("fn", BindingFlags.NonPublic | BindingFlags.Instance);
try
{
mi.Invoke(instance, new object[] { null });
}
catch(TargetInvocationException targetEx)
{
if (targetEx.InnerException != null)
{
throw targetEx.InnerException;
}
}


http://www.cnblogs.com/change/archive/2005/05/30/165217.aspx
jshi123 2011-12-10
  • 打赏
  • 举报
回复
用Ex.InnerException可以看到MethodErr2抛出的原始异常
ycg_893 2011-12-10
  • 打赏
  • 举报
回复
一般来说这种错通常是 构造出错\参数出错\对象未实例化等.
cnwolfs 2011-12-10
  • 打赏
  • 举报
回复
怎么都是这些回答啊?郁闷
绿领巾童鞋 2011-12-10
  • 打赏
  • 举报
回复
WINCE平台?什么位置可能抛异常,在那个地方try-catch,自己手写MessageBox提示吧。那个平台太节省了...
吾非大神 2011-12-10
  • 打赏
  • 举报
回复
让用户看的异常 是不是可以自己定义一下呢
而不是将代码产生的异常反馈给用户,用户不一定懂撒
dalmeeme 2011-12-10
  • 打赏
  • 举报
回复
帖子快沉了,帮顶一下。

111,086

社区成员

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

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

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