Version: 1.4.x

异常处理

发送HTTP请求不会总是成功的,总会有失败的情况。Forest提供多种异常处理的方法来处理请求失败的过程。

try-catch方式

最常用的是直接用try-catch。Forest请求失败的时候通常会以抛异常的方式报告错误, 获取错误信息只需捕获ForestNetworkException异常类的对象,如示例代码所示:

/**
* try-catch方式:捕获ForestNetworkException异常类的对象
*/
try {
String result = myClient.send();
} catch (ForestNetworkException ex) {
int status = ex.getStatusCode(); // 获取请求响应状态码
ForestResponse response = ex.getResponse(); // 获取Response对象
String content = response.getContent(); // 获取请求的响应内容
String resResult = response.getResult(); // 获取方法返回类型对应的最终数据结果
}

回调函数方式

第二种方式是使用OnError回调函数,如示例代码所示:

/**
* 在请求接口中定义OnError回调函数类型参数
*/
@Request(
url = "http://localhost:5000/hello/user",
headers = {"Accept:text/plain"},
data = "username=${username}"
)
String send(@DataVariable("username") String username, OnError onError);

调用的代码如下:

// 在调用接口时,在Lambda中处理错误结果
myClient.send("foo", (ex, request, response) -> {
int status = response.getStatusCode(); // 获取请求响应状态码
String content = response.getContent(); // 获取请求的响应内容
String result = response.getResult(); // 获取方法返回类型对应的最终数据结果
});
注意

加上OnError回调函数后便不会再向上抛出异常,所有错误信息均通过OnError回调函数的参数获得。

ForestResponse

第三种,用ForestResponse类作为请求方法的返回值类型,示例代码如下:

/**
* 用`ForestResponse`类作为请求方法的返回值类型, 其泛型参数代表实际返回数据的类型
*/
@Request(
url = "http://localhost:5000/hello/user",
headers = {"Accept:text/plain"},
data = "username=${username}"
)
ForestResponse<String> send(@DataVariable("username") String username);

调用和处理的过程如下:

ForestResponse<String> response = myClient.send("foo");
// 用isError方法判断请求是否失败, 比如404, 500等情况
if (response.isError()) {
int status = response.getStatusCode(); // 获取请求响应状态码
String content = response.getContent(); // 获取请求的响应内容
String result = response.getResult(); // 获取方法返回类型对应的最终数据结果
}
注意

ForestResponse类为返回值类型的方法也不会向上抛出异常,错误信息均通过ForestResponse对象获得。

拦截器方式

若要批量处理各种不同请求的异常情况,可以定义一个拦截器, 并在拦截器的onError方法中处理异常,示例代码如下:

public class ErrorInterceptor implements Interceptor<String> {
// ... ...
@Override
public void onError(ForestRuntimeException ex, ForestRequest request, ForestResponse response) {
int status = response.getStatusCode(); // 获取请求响应状态码
String content = response.getContent(); // 获取请求的响应内容
Object result = response.getResult(); // 获取方法返回类型对应的返回数据结果
}
}
提示

关于具体如何使用拦截器请参见 《拦截器

Last updated on