我正在使用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)
发送的结果。
我做错了什么?感谢。
答案 0 :(得分:0)
经过一番调查,犯罪是Play的Security
行为。
更多详情:https://groups.google.com/forum/#!topic/play-framework/AY4NuQziYyM
因为我在AbstractController
级别添加了自定义操作,在控制器级别添加了@Authenticated(Authenticator.class)
注释,所以安全操作组合是最后一个要执行的操作。
由于第51行的Security.java,即使我的例外是预期的,Play也会引发RuntimeException
。
所以解决方案是在方法级别添加安全注释,以确保在第一次执行方法之前执行它。