4

我正在使用 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)

我究竟做错了什么 ?谢谢。

4

1 回答 1

1

经过一番调查,有罪的是SecurityPlay的行为。更多详细信息:https ://groups.google.com/forum/#!topic/play-framework/AY4NuQziYyM

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

由于第 51 行的Security.java,即使我的异常是预期的,Play 也会抛出一个RuntimeException.

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

于 2014-07-17T14:05:42.100 回答