gpt4 book ai didi

java - 从反射调用的方法传播 RuntimeException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:40 24 4
gpt4 key购买 nike

我从代码开始。这个调用一个使用反射的方法

try {
Method method = states.getClass().getDeclaredMethod(
getCurrentStateId() + "_" + request.getEvent());
states.setData(request, dataManager);
method.invoke(states);
} catch (NoSuchMethodException e) {
logger.debug("Method " + getCurrentStateId() + "_" + request.getEvent()
+ " cannot be found - invocation not performed.", e);
} catch (IllegalArgumentException e) {
throw new InternalException("Method invocation with reflection failed.", e);
} catch (IllegalAccessException e) {
throw new InternalException("Method invocation with reflection failed.", e);
} catch (InvocationTargetException e) {
throw new InternalException("Method invocation with reflection failed.", e);
}

并使用抛出 PropertiesDontMatchException(运行时)的以下代码调用该方法。

...
if (totalCredits < minimumCredits || totalCredits > maximumCredits) {
throw new PropertiesDontMatchException("Minimum amount of credits=" + minimumCredits
+ ", maximum amount of credits=" + maximumCredits + ". Your amount of credits=" + totalCredits + ". You have to modify your set of subjects.");
}
...

问题是我的运行时异常被包装到 InvocationTargetException 中并在第一个代码片段中被捕获。这不是我想要的。但是根据文档,这是正确的行为。

所以我想到了这个解决方案

...
} catch (InvocationTargetException e) {
if (e.getCause() instanceof PropertiesDontMatchException) {
throw (PropertiesDontMatchException) e.getCause();
}
throw new InternalException("Method invocation with reflection failed.", e);
}
...

这是传播我的运行时异常的正确方法还是有更好的解决方案?

最佳答案

是的,在这种情况下这是正确的错误处理。我只会针对任何 RuntimeException 扩展您的测试:

} catch (InvocationTargetException e) {
if (e.getCause() instanceof RuntimeException) {
throw (RuntimeException) e.getCause();
}
if (e.getCause() instanceof Error) {
throw (Error) e.getCause();
}
throw new InternalException("Method invocation with reflection failed.", e);
}

或者使用Throwables utility class来自 相反,如果您不介意使用 RuntimeException 而不是自定义 InternalException 来检查异常:

} catch (InvocationTargetException e) {
throw Throwables.propagate(e.getCause());
}

额外的包装是区分你的例子所必需的。你的方法抛出 IllegalAccessException 并且反射机制本身抛出它。

类似的 API 设计选择可以通过 Future.get() 观察到- 如果异步作业抛出异常 ExecutionException抛出包装实际异常。

关于java - 从反射调用的方法传播 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10147945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com