Selaa lähdekoodia

修复转换器抛出的异常全被ConvertException包裹的问题

drake 3 vuotta sitten
vanhempi
commit
ff8dd82fa2

+ 3 - 2
docs/error-handle.md

@@ -66,9 +66,10 @@ catch里面的`it`属于异常对象, 这里列举可能存在的异常
 | ResponseException | 响应异常, 这里属于后端返回的错误码和其定义的成功码不匹配 |
 | NullPointerException | 空指针, 一般是在作用域内操作一个空的对象 |
 | NoCacheException | 没有缓存 |
-| NetException | 未知的网络异常, 一般情况应当继承他来创建自定义的网络异常 |
+| NetException | 未知的网络异常, 一般情况应当继承他来创建自定义的网络异常  |
 
-假设你重写`NetConverter`可以改变异常发生的条件, 当然你在转换器或者拦截器中抛出任何异常都会被捕获或者全局处理, 这里你可以自定义你的异常
+假设你重写`NetConverter`可以改变异常发生的条件, 当然你在转换器或者拦截器中抛出任何异常都会被捕获或者全局处理 <br>
+转换器中发生的所有异常除非是NetException的子类否则都将被ConvertException包裹(即捕获的是ConvertException).
 
 
 ## 覆盖默认错误处理

+ 7 - 2
net/src/main/java/com/drake/net/interfaces/NetCallback.kt

@@ -1,7 +1,7 @@
 package com.drake.net.interfaces
 
 import com.drake.net.NetConfig
-import com.drake.net.request.converter
+import com.drake.net.response.convert
 import com.drake.net.utils.runMain
 import okhttp3.Call
 import okhttp3.Callback
@@ -18,7 +18,12 @@ abstract class NetCallback<T> : Callback {
 
     override fun onResponse(call: Call, response: Response) {
         val succeed = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
-        val data = response.request.converter()?.onConvert<T>(succeed, response) ?: return
+        val data = try {
+            response.convert<T>(succeed)
+        } catch (e: IOException) {
+            onFailure(call, e)
+            return
+        }
         runMain {
             onSuccess(call, data)
             onComplete(call, null)

+ 20 - 2
net/src/main/java/com/drake/net/response/ResponseExtention.kt

@@ -20,6 +20,7 @@ import com.drake.net.body.peekString
 import com.drake.net.convert.NetConverter
 import com.drake.net.exception.ConvertException
 import com.drake.net.exception.DownloadFileException
+import com.drake.net.exception.NetException
 import com.drake.net.reflect.typeTokenOf
 import com.drake.net.request.*
 import com.drake.net.utils.isValid
@@ -28,6 +29,8 @@ import okhttp3.Response
 import okio.buffer
 import okio.sink
 import java.io.File
+import java.io.IOException
+import java.lang.reflect.Type
 import java.net.SocketException
 import java.net.URLDecoder
 import kotlin.coroutines.cancellation.CancellationException
@@ -132,11 +135,26 @@ fun Response.logString(byteCount: Long = 1024 * 1024 * 4): String? {
 /**
  * 响应体使用转换器处理数据
  */
-@Throws(ConvertException::class)
+@Throws(IOException::class)
 inline fun <reified R> Response.convert(converter: NetConverter): R = use {
     try {
         converter.onConvert<R>(typeTokenOf<R>(), it) as R
-    } catch (e: ConvertException) {
+    } catch (e: NetException) {
+        throw e
+    } catch (e: Throwable) {
+        throw ConvertException(it, cause = e)
+    }
+}
+
+@Suppress("UNCHECKED_CAST")
+@Throws(IOException::class)
+fun <R> Response.convert(type: Type): R = use {
+    try {
+        val converter = request.converter() ?: throw ConvertException(
+            it, message = "No converter for current request"
+        )
+        converter.onConvert<R>(type, this) as R
+    } catch (e: NetException) {
         throw e
     } catch (e: Throwable) {
         throw ConvertException(it, cause = e)