Java 处理异步Webservice请求上的异常
使用Play实现web服务请求,我还是新手!框架2.1 WS-library。现在,我在理解WS-library行为方面遇到了问题 首先,我有这样的代码:Java 处理异步Webservice请求上的异常,java,playframework,playframework-2.1,Java,Playframework,Playframework 2.1,使用Play实现web服务请求,我还是新手!框架2.1 WS-library。现在,我在理解WS-library行为方面遇到了问题 首先,我有这样的代码: public static Result espnRss() { try { // do request return async( WS.url("http://espnfc.com/rss/news?section=premierleague").get().map(
public static Result espnRss() {
try {
// do request
return async(
WS.url("http://espnfc.com/rss/news?section=premierleague").get().map(
new F.Function<WS.Response, Result>() {
@Override
public Result apply(WS.Response response) throws Throwable {
return ok("Success!"); // success request
}
}
)
);
} catch (Exception e) {
// exception occured
return internalServerError("Oops, connect exception occured!");
}
}
public static Result espnRss() {
try {
// set request timeout for 1000 ms and do request
return async(
WS.url("http://espnfc.com/rss/news?section=premierleague").setTimeout(1000).get().map(
... // same as previous
)
);
} catch (Exception e) {
// exception occured
return internalServerError("Oops, connect exception occured!");
}
}
我的internet连接不快(下载速度约为40 KB/s),我故意这么做(设置请求超时1秒),以执行异常处理代码
但是,我从框架获得默认响应,而不是internalServerError
响应提供的代码
Execution Exception
[TimeoutException: No response received after 1000]
有人能解释一下为什么不能使用上面的代码捕获WS-request异常吗?使用Play处理异常的最佳方法是什么!框架WS-library?我不熟悉Play框架,但
async
必须返回/使用某种未来。请求实际上是在一个单独的线程中执行的,您的try..catch
处理程序显然不会捕获异常
必须有一些函数/方法,如
onComplete
,可以应用于async
,允许您测试运行请求的结果。来处理异步请求时发生的异常,例如WS
播放请求!框架2.1.0中,有一个名为Promise
的方法
当我们想要处理使用WS
库请求时发生的所有异常时,应该调用该方法。因此,我使用如下代码解决了这个问题:
public static Result espnRss() {
// do request
return async(
WS.url("http://espnfc.com/rss/news?section=premierleague").setTimeout(100).get().map(
new F.Function<WS.Response, Result>() {
@Override
public Result apply(WS.Response response) throws Throwable {
return ok("Success!"); // success request
}
}
).recover( // to handle error occured on redeemed PROMISE
new F.Function<Throwable, Result>() {
@Override
public Result apply(Throwable throwable) throws Throwable {
// option to distinguish exception
if (throwable instanceof TimeoutException) {
return internalServerError("Oops, time out exception occured!");
} else {
return internalServerError("Oops, other exception occured!");
}
}
}
)
);
}
公共静态结果espnRss(){
//请求
异步返回(
WS.url(“http://espnfc.com/rss/news?section=premierleague“”.setTimeout(100).get().map(
新F.函数(){
@凌驾
公共结果应用(WS.Response-Response)抛出可丢弃{
返回ok(“成功!”;//成功请求
}
}
).recover(//用于处理兑现承诺时发生的错误
新F.函数(){
@凌驾
公共结果应用(Throwable Throwable)抛出Throwable{
//区分异常的选项
if(TimeoutException的可丢弃实例){
返回internalServerError(“Oops,发生超时异常!”);
}否则{
返回internalServerError(“Oops,发生了其他异常!”);
}
}
}
)
);
}
上面的TimeoutException
应该是F.promiseTimoutexception
?