Browse Source

优化异常处理

drake 3 years ago
parent
commit
0af349d01f

+ 16 - 8
net/src/main/java/com/drake/net/convert/JSONConvert.kt

@@ -24,6 +24,7 @@ import com.drake.net.exception.RequestParamsException
 import com.drake.net.exception.ResponseException
 import com.drake.net.exception.ServerResponseException
 import okhttp3.Response
+import org.json.JSONException
 import org.json.JSONObject
 import java.lang.reflect.Type
 
@@ -48,13 +49,20 @@ abstract class JSONConvert(
             val code = response.code
             when {
                 code in 200..299 -> { // 请求成功
-                    val body = response.body?.string() ?: return null
-                    if (succeed === String::class.java) return body as R
-                    val jsonObject = JSONObject(body) // 获取JSON中后端定义的错误码和错误信息
-                    if (jsonObject.getString(this.code) == success) { // 对比后端自定义错误码
-                        return body.parseBody(succeed)
-                    } else { // 错误码匹配失败, 开始写入错误异常
-                        throw ResponseException(response, jsonObject.optString(message, NetConfig.app.getString(com.drake.net.R.string.no_error_message)))
+                    val bodyString = response.body?.string() ?: return null
+                    return try {
+                        val json = JSONObject(bodyString) // 获取JSON中后端定义的错误码和错误信息
+                        if (json.getString(this.code) == success) { // 对比后端自定义错误码
+                            bodyString.parseBody<R>(succeed)
+                        } else { // 错误码匹配失败, 开始写入错误异常
+                            val errorMessage = json.optString(
+                                message,
+                                NetConfig.app.getString(com.drake.net.R.string.no_error_message)
+                            )
+                            throw ResponseException(response, errorMessage)
+                        }
+                    } catch (e: JSONException) { // 固定格式JSON分析失败直接解析JSON
+                        bodyString.parseBody<R>(succeed)
                     }
                 }
                 code in 400..499 -> throw RequestParamsException(response) // 请求参数错误
@@ -70,5 +78,5 @@ abstract class JSONConvert(
      * @param succeed JSON对象的类型
      * @receiver 原始字符串
      */
-    abstract fun <S> String.parseBody(succeed: Type): S?
+    abstract fun <R> String.parseBody(succeed: Type): R?
 }

+ 1 - 1
net/src/main/java/com/drake/net/exception/NetException.kt

@@ -33,6 +33,6 @@ open class NetException(
 ) : IOException(message, cause) {
 
     override fun getLocalizedMessage(): String? {
-        return if (message == null) "$message (${request.url})" else "(${request.url})"
+        return if (message != null) "$message (${request.url})" else "(${request.url})"
     }
 }

+ 10 - 9
net/src/main/java/com/drake/net/request/BaseRequest.kt

@@ -19,10 +19,11 @@ package com.drake.net.request
 
 import com.drake.net.NetConfig
 import com.drake.net.convert.NetConverter
+import com.drake.net.exception.ConvertException
 import com.drake.net.exception.URLParseException
 import com.drake.net.interfaces.ProgressListener
 import com.drake.net.okhttp.toNetOkhttp
-import com.drake.net.reflect.typeTokenOf
+import com.drake.net.response.convert
 import com.drake.net.tag.NetLabel
 import com.drake.net.utils.runMain
 import okhttp3.*
@@ -289,9 +290,7 @@ abstract class BaseRequest {
         setKType<R>()
         val request = buildRequest()
         val newCall = okHttpClient.newCall(request)
-        return newCall.execute().use {
-            converter.onConvert<R>(typeTokenOf<R>(), it) as R
-        }
+        return newCall.execute().convert(converter)
     }
 
     /**
@@ -304,9 +303,7 @@ abstract class BaseRequest {
         val request = buildRequest()
         val newCall = okHttpClient.newCall(request)
         return try {
-            val value = newCall.execute().use {
-                converter.onConvert<R>(typeTokenOf<R>(), it) as R
-            }
+            val value = newCall.execute().convert<R>(converter)
             Result.success(value)
         } catch (e: Exception) {
             Result.failure(e)
@@ -338,8 +335,12 @@ abstract class BaseRequest {
             }
 
             override fun onResponse(call: Call, response: Response) {
-                val result = converter.onConvert<R>(typeTokenOf<R>(), response) as R
-                runMain { block(Result.success(result)) }
+                try {
+                    val success = response.convert<R>(converter)
+                    runMain { block(Result.success(success)) }
+                } catch (e: ConvertException) {
+                    onFailure(call, e)
+                }
             }
         })
         return newCall

+ 17 - 0
net/src/main/java/com/drake/net/response/ResponseExtention.kt

@@ -17,7 +17,10 @@
 package com.drake.net.response
 
 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.reflect.typeTokenOf
 import com.drake.net.request.*
 import com.drake.net.utils.isValid
 import com.drake.net.utils.md5
@@ -123,4 +126,18 @@ fun Response.logString(byteCount: Long = 1024 * 1024 * 4): String? {
     } else {
         "Not support this type $mediaType"
     }
+}
+
+/**
+ * 响应体使用转换器处理数据
+ */
+@Throws(ConvertException::class)
+inline fun <reified R> Response.convert(converter: NetConverter): R = use {
+    try {
+        converter.onConvert<R>(typeTokenOf<R>(), it) as R
+    } catch (e: ConvertException) {
+        throw e
+    } catch (e: Throwable) {
+        throw ConvertException(it, cause = e)
+    }
 }