/**
* description: 非服务器产生的异常,比如本地无无网络请求,Json数据解析错误等等.
* @author Sorgs.
* Created date: 2019/7/30.
*/
class ErrorResumeFunction<T> : Function<Throwable, ObservableSource<out ResponseData<T>>> {
override fun apply(throwable: Throwable): ObservableSource<out ResponseData<T>> {
return Observable.error(CustomException.handleException(throwable))
}
}
/**
* description: 自定义异常处理,包括解析异常等其他异常.
*
* @author Sorgs.
* Created date: 2019/7/30.
*/
object CustomException {
/**
* 未知错误
*/
const val UNKNOWN = 1000
/**
* 解析错误
*/
const val PARSE_ERROR = 1001
/**
* 网络错误
*/
const val NETWORK_ERROR = 1002
/**
* 协议错误
*/
const val HTTP_ERROR = 1003
fun handleException(e: Throwable): LocalException {
val ex: LocalException
if (e is JsonParseException
|| e is JSONException
|| e is ParseException
) {
//解析错误
ex = LocalException(PARSE_ERROR, e.message)
return ex
} else if (e is ConnectException) {
//网络错误
ex = LocalException(NETWORK_ERROR, e.message)
return ex
} else if (e is UnknownHostException || e is SocketTimeoutException) {
//连接错误
ex = LocalException(NETWORK_ERROR, e.message)
return ex
} else {
//未知错误
ex = LocalException(UNKNOWN, e.message)
return ex
}
}
}
```
- 把异常进行封装成自己的异常处理。提前把Json转化出错,网络错误,连接异常处理出来
- 再利用继承ResponseFunction进行处理服务器异常处理,然后把异常进行封装。正确的数据发送到下游
```java
/**
* description: 服务其返回的数据解析
* 正常服务器返回数据和服务器可能返回的exception.
* @author Sorgs.
* Created date: 2019/7/30.
*/
class ResponseFunction<T> : Function<ResponseData<T>, ObservableSource<T>> {
override fun apply(tResponseData: ResponseData<T>): ObservableSource<T> {
val code = tResponseData.code
val message = tResponseData.msg
return if (code == 200) {
Observable.just(tResponseData.data)
} else {
Observable.error(LocalException(code, message))
}
}
}
/**
* description: 异常处理.
*
* @author Sorgs.
* Created date: 2019/7/30.
*/
class LocalException : Exception {
var code: Int = 0
var displayMessage: String? = null
constructor(code: Int, displayMessage: String?) {
this.code = code
this.displayMessage = displayMessage
}
constructor(code: Int, message: String, displayMessage: String?) : super(message) {
this.code = code
this.displayMessage = displayMessage
}
}