如何使用Play 2.3.X中的动作组合捕获异常

时间:2014-07-16 00:32:40

标签: composition playframework-2.3

我正在使用Play 2.3.1开发一个应用程序。 我正在使用以下操作注释所有控制器:

@Override
public Promise<Result> call(final Context ctx) throws Throwable {
    try {
        return delegate.call(ctx);
    } catch (MyCustomException e) {
        return handleCustomException(e);
    } catch (Exception e) {
        return handleUnexpectedError(e);
    }
}

此操作的目的是捕获控制器方法抛出的任何异常,以便向用户发送干净的消息。 MyCustomException是我的应用程序特定异常,扩展了Exception

问题是即使我在控制器的方法中抛出MyCustomException,也永远不会执行相应的catch语句。 我总是RuntimeException导致MyCustomException

结果是,无论发生什么异常,用户始终会看到handleUnexpectedError(e)发送的结果。

我做错了什么?感谢。

1 个答案:

答案 0 :(得分:0)

经过一番调查,犯罪是Play的Security行为。 更多详情:https://groups.google.com/forum/#!topic/play-framework/AY4NuQziYyM

因为我在AbstractController级别添加了自定义操作,在控制器级别添加了@Authenticated(Authenticator.class)注释,所以安全操作组合是最后一个要执行的操作。

由于第51行的Security.java,即使我的例外是预期的,Play也会引发RuntimeException

所以解决方案是在方法级别添加安全注释,以确保在第一次执行方法之前执行它。