我有一个无状态会话bean,它带有一个抛出异常的方法(从Exception扩展)。
@Stateless
@LocalBean
public class MyBean {
...
public void myMethod() throws MyException {
...
}
}
但是我无法捕捉到异常。
try {
myBean.myMethod
} catch (MyException e) {
...
}
这是堆栈:
WARNING: StandardWrapperValve[MyServlet]: PWC1406: Servlet.service() for servlet MyServlet threw exception
java.lang.IllegalAccessError: example/MyException
at $Proxy327.myMethod(Unknown Source)
at example.EJB31_Generated_MyBean_Intf_Bean_.myMethod(Unknown Source)
at example.MyServlet.processRequest(MyServlet.java:36)
at example.MyServlet.doGet(MyServlet.java:71)
...
我认为,这是因为调用bean方法会通过代理。我该如何捕捉异常?或者应该避免在会话bean中抛出异常的方法? - 我希望不会。
答案 0 :(得分:1)
因为堆栈跟踪显示它实际上是抛出的IllegalAccessError ...请参阅其API文档:http://docs.oracle.com/javase/6/docs/api/java/lang/IllegalAccessError.html
你不能通过添加catch (Exception e) {...}
来捕获这个...因为它是一个错误,它不是Exception的子类。如果你真的想抓住它,你必须添加catch (Throwable t) {...}
,我强烈反对。而是找到抛出错误的原因。我想我们需要看到更多你的代码...
正如API所说“正常情况下,编译器会捕获此错误;如果类的定义发生不兼容的更改,则此错误只能在运行时发生”...是否在服务器和客户端上重新部署以确保使用相同的接口定义?