Java 未捕获自定义运行时异常

Java 未捕获自定义运行时异常,java,jakarta-ee,exception-handling,runtimeexception,Java,Jakarta Ee,Exception Handling,Runtimeexception,我有自己的ApplicationException,它扩展了RuntimeException: package com.haslerrail.aura.common.exception; public class ApplicationException extends RuntimeException { private static final long serialVersionUID = 1L; private final ErrorCode errorCode;

我有自己的ApplicationException,它扩展了RuntimeException:

package com.haslerrail.aura.common.exception;

public class ApplicationException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private final ErrorCode errorCode;

    private final Object[] arguments;

    public ApplicationException(final ErrorCode errorCode, final Object... arguments) {
        super();
        this.errorCode = errorCode;
        this.arguments = arguments;
    }

    public ErrorCode getErrorCode() {
        return errorCode;
    }

    public Object[] getArguments() {
        return arguments;
    }

}
此异常将作为我的无状态bean的函数引发:

public void doSomething()
        throws IOException, ApplicationException, InternalException {
    if (true) {
        throw new ApplicationException(ErrorCode.FILE_TYPE_NOT_SUPPORTED, "test");
    }
}
我希望通过sessionScoped bean捕获此runtimeException,如下所示:

public void doXXX(final FileUploadEvent event) throws SystemException {
    try {

        myStatelessbean.doSomething();  // Throw my ApplicationExcetion

    } catch (final ApplicationException e) {
        System.out.println("catch ApplicationException");
    } catch (final Exception e) {
        System.out.println("catch Exception");
    }

}
我的问题是,异常被异常捕获,而不是被我自己的ApplicationException捕获!我不知道我做错了什么

e、 printStackTrace()提供异常文本:

javax.ejb.EJBException: com.haslerrail.aura.common.exception.ApplicationException
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:166)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:304)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:76)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:32)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165)
    at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:173)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
    at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:72)
    at XXXX.myStatelessbean.$$$view353.doSomething(Unknown Source)  

这里的问题是,您正在抛出一个
RuntimeException
,而不是某种选中的异常

在这种情况下,当发生
RuntimeException
时,EJBContainer将回滚事务并抛出
EJBException
(这也是
RuntimeException
)结果是,您的客户机不会直接看到您的自定义异常,而是看到容器抛出的
EJBException

您可以抛出一个选中的异常(只是不要扩展
RuntimeException
,而是
Exception
),但在必要时,您必须自己回滚事务。 另一方面,您可以展开EJBContainer抛出的EJBException以获取原因,如果这对您来说真的很有趣的话

有关EJB中异常处理的更多详细信息,请参阅本博客文章:

请检查
@ApplicationException
的语义,EJB规范从中指出,如此注释的异常将被发送到未包装的客户端。本质上,如果抛出任何其他未注释的异常
@ApplicationException
,则ejb容器将抛出的异常包装到
EJBException
中,并将其抛出到客户端。因此,您永远无法在客户端捕获实际的异常

//I always set rollback, cause its needless in most circumstances to commit transaction when an exception occurs.
@ApplicationException(rollback = true, inherit=true)
public class MyApplicationException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    private final ErrorCode errorCode;

    private final Object[] arguments;

    public MyApplicationException(final ErrorCode errorCode, final Object... arguments) {
        super();
        this.errorCode = errorCode;
        this.arguments = arguments;
    }

    public ErrorCode getErrorCode() {
        return errorCode;
    }

    public Object[] getArguments() {
        return arguments;
    }

}

打印实际异常的类和堆栈跟踪,这样就更容易找到错误。此外,除了User2612300编写的内容外,还有一些关于无状态EJB的更多信息。它是否实现了业务接口?业务界面中是否声明了
ApplicationException
?第一个猜测是第二个类中的错误导入。@Nikos Paraskevopoulos:Ou是的。bean有一个@Interceptors(ExceptionInterceptor.class)。。。我必须检查一下!谢谢你指出这一点。我不知道我不能在支持bean中捕获runtimeException。我将我的异常更改为“正常”异常,现在它可以工作了…答案是Hi@maress+1。这对我来说绝对有效!。。。我更新了您的答案,包括对JBoss AS 7.1的“@ApplicationException”注释的更改