怎么捕获反射过程中的异常?

dq 2004-01-13 10:44:53
用java.lang.reflect.Method.invoke调用反射过程,其中实际的代码是抛出了异常的(print出来了),这样得到的结果显然不正确,但invoke本身(即主程序流程)却没有报错。怎么办?
...全文
191 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dq 2004-01-14
  • 打赏
  • 举报
回复
唉,不好意思各位,一时糊涂问了这么个问题。

既然是“invoke所调用的实际代码catch后print出来的”——他已经catch了,并且
没有再throw出来,我当然是截不到了!!!

因为我当时问了那个同事,他也不是很清楚,所以我以为是我的问题。
但是他不清楚却又是因为他的程序里又调用了另外一个同事的代码,那个异常是第二个同事的程序处理了的。

呵呵,给大家添乱了。

过年好!散分!
dq 2004-01-13
  • 打赏
  • 举报
回复
to xixigongzhu(夕夕公主) :
怪我没说清楚,那个异常是invoke所调用的实际代码catch后print出来的。
我所谓的“其中实际的代码”就是这个意思,即不是主流程中的invoke。

to whyxx(我也是新手) :
我的流程作为主框架模块通过反射调用了另一个同事的一个方法,他也有异常处理,所以那个异常信息是他的程序打到控制台的。但是我的程序(invoke)没有出现异常,也就不是你列出的那三种。

to all:
我是想不管他的异常是什么,既然是通过我的invoke调用出现的异常,我的流程怎么会没有一点反应呢?
年底这几天极忙,还有更重要的一些其它问题没搞定,所以来麻烦各位啦。

至于帖代码,我现在只能把我的代码贴出来,他的我拿不到。
(下面是一段反射操作封装,只改了后面的两条注释)

private static Object doReflect(Pack code) throws Exception {
Class[] args = null;
Object[] vals = null;
int cnt = 0;
List list = code.list("para");
if (list != null) {
cnt = list.size();
args = new Class[cnt];
vals = new Object[cnt];
}
for (int i = 0; i < cnt; i++) {
Pack pack = (Pack)list.get(i);
String type = pack.getType();
String value = pack.getValue();
int dim = Tool.dimArray(type);//得到参数类型数组维数(0表示不是数组)
if (dim > 0) type = type.substring(0, type.indexOf("["));
type = Tool.typeName(type);//得到参数逻辑数据类型
args[i] = Tool.typeClass(type, dim);//得到参数的对象
//得到参数值
if (value.equals("null")) continue;
if (dim > 0) {//处理数组
String[] val = value.split(",");
Object ary = Array.newInstance(args[i], val.length);
for (int j = 0; j < val.length; j++) {
if (type.equals("str")) Array.set(ary,j, val[j]);
else if (type.equals("int")) Array.setInt(ary, j, Tool.s2n(val[j]));
else if (type.equals("bool")) Array.setBoolean(ary, j, Tool.s2b(val[j]));
else ;//其它(暂未处理)
}
vals[i] = ary;
} else vals[i] = Tool.newObject(type, value);
}
String class_name = code.getProp("class");
Class cls = null;
Object obj = null;
if (class_name.equals("")) {//DatabaseMetaData操作
obj = dbmd;
cls = obj.getClass();
} else {//系统其它函数或用户自定义函数(我碰到的问题走的是这儿)
cls = Class.forName(class_name);
obj = cls.newInstance();
}
Method method = cls.getMethod(code.getName(), args);
return method.invoke(obj, vals);//在这儿我同事的程序在控制台打出了异常信息
}

(这是调用上述方法的代码,省略了无关流程)
try {
Pack exec = code.get("exec");
if (exec != null) {//内部函数
//......略掉
} else result = doReflect(code);//在这儿调用,但下面的两段catch都没有触发
} catch (InvocationTargetException e) {
throw new WorkException("命令执行失败", e.getTargetException());
} catch (Exception e) {
throw new WorkException("命令执行错误", e);
}
//......下面的代码接着走了,没问题


希望这次说得清楚了些,再有代码相关的解释问题各位尽管发话,多谢多谢!
favourl 2004-01-13
  • 打赏
  • 举报
回复
可能真的是Error,仔细检查一下,由一些地方是null等等,最好是把代码贴出来
whyxx 2004-01-13
  • 打赏
  • 举报
回复
invoke方法会抛出三种IllegalAccessException, IllegalArgumentException,InvocationTargetException异常,你这里是不是这三种当中的一种,如果不是,查查看是不是程序其他什么地方有问题.
whyxx 2004-01-13
  • 打赏
  • 举报
回复
to: xixigongzhu(夕夕公主)
楼主的意思应该是说程序中断后打在控制台上的异常.
xixigongzhu 2004-01-13
  • 打赏
  • 举报
回复
仔细看楼主的问题,其中那句:"其中实际的代码是抛出了异常的(print出来了)"

我奇怪的是,扔出来的异常还能打印出来?

一般程序扔出异常就会终止,又怎么能print这个异常呢?

可能是楼主catch了这个异常吧
dq 2004-01-13
  • 打赏
  • 举报
回复
多谢各位关注和提醒,BUT

问题是我在主流程中没有catch到任何Exception(当然也没有InvocationTargetException)。
即——在主流程中,不是找不出异常,而是根本没有异常。

按理说JVM应该把invoke的执行异常打包进InvocationTargetException返回的,所以很是奇怪。这也可能是比较特殊的情况,我还没来得及仔细测试。希望有碰到过的兄弟指点一下。
Leemaasn 2004-01-13
  • 打赏
  • 举报
回复
呵呵。。。


试试看InvocationTargetException.getTargetException()
tiger_wkh52741 2004-01-13
  • 打赏
  • 举报
回复
又是反射技术啊!
这几天讨论的很多嘛.
楼主搜索一下!
关注一下!
miwoo 2004-01-13
  • 打赏
  • 举报
回复
InvocationTargetException.getTargetException()
filippo1980 2004-01-13
  • 打赏
  • 举报
回复
关注一下up
dq 2004-01-13
  • 打赏
  • 举报
回复
TT

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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