idtitlesidebar_label
exception
异常处理
异常处理

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

try-catch方式

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

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

回调函数方式

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

  1. /**
  2. * 在请求接口中定义OnError回调函数类型参数
  3. */
  4. @Request(
  5. url = "http://localhost:8080/hello/user",
  6. headers = {"Accept:text/plain"},
  7. data = "username=${username}"
  8. )
  9. String send(@DataVariable("username") String username, OnError onError);

调用的代码如下:

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

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

ForestResponse

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

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

调用和处理的过程如下:

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

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

拦截器方式

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

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

:::info 提示 关于具体如何使用拦截器请参见 《拦截器》 :::