Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理异步Webservice请求上的异常_Java_Playframework_Playframework 2.1 - Fatal编程技术网

Java 处理异步Webservice请求上的异常

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(

使用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(
                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