id | title | sidebar_label |
---|---|---|
exception | 异常处理 | 异常处理 |
发送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(); // 获取方法返回类型对应的最终数据结果
});
:::caution 注意 加上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(); // 获取方法返回类型对应的最终数据结果
}
:::caution 注意 以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(); // 获取方法返回类型对应的返回数据结果
}
}
:::info 提示 关于具体如何使用拦截器请参见 《拦截器》 :::