// Path: app/src/main/java/york/com/retrofit2rxjavademo/http/exception/ApiException.java
// public class ApiException extends Exception {
//     // 异常处理，为速度，不必要设置getter和setter
//     public int code;
//     public String message;
// 
//     public ApiException(Throwable throwable, int code) {
//         super(throwable);
//         this.code = code;
//     }
// }
// 
// Path: app/src/main/java/york/com/retrofit2rxjavademo/http/exception/ErrorType.java
// public interface ErrorType {
//     /**
//      * 正常
//      */
//     int SUCCESS = 0;
//     /**
//      * 未知错误
//      */
//     int UNKNOWN = 1000;
//     /**
//      * 解析错误
//      */
//     int PARSE_ERROR = 1001;
//     /**
//      * 网络错误
//      */
//     int NETWORD_ERROR = 1002;
//     /**
//      * 协议出错
//      */
//     int HTTP_ERROR = 1003;
// }
// 
// Path: app/src/main/java/york/com/retrofit2rxjavademo/http/exception/ServerException.java
// public class ServerException extends RuntimeException{
//     // 异常处理，为速度，不必要设置getter和setter
//     public int code;
//     public String message;
// 
//     public ServerException(String message, int code) {
//         super(message);
//         this.code = code;
//         this.message = message;
//     }
// }


import android.net.ParseException;
import com.google.gson.JsonParseException;
import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import retrofit2.adapter.rxjava.HttpException;
import york.com.retrofit2rxjavademo.http.exception.ApiException;
import york.com.retrofit2rxjavademo.http.exception.ErrorType;
import york.com.retrofit2rxjavademo.http.exception.ServerException;
            switch(httpException.code()){
                case UNAUTHORIZED:
                    ex.message = "当前请求需要用户验证";
                    break;
                case FORBIDDEN:
                    ex.message = "服务器已经理解请求，但是拒绝执行它";
                    break;
                case NOT_FOUND:
                    ex.message = "服务器异常，请稍后再试";
                    break;
                case REQUEST_TIMEOUT:
                    ex.message = "请求超时";
                    break;
                case GATEWAY_TIMEOUT:
                    ex.message = "作为网关或者代理工作的服务器尝试执行请求时，未能及时从上游服务器（URI标识出的服务器，例如HTTP、FTP、LDAP）或者辅助服务器（例如DNS）收到响应";
                    break;
                case INTERNAL_SERVER_ERROR:
                    ex.message = "服务器遇到了一个未曾预料的状况，导致了它无法完成对请求的处理";
                    break;
                case BAD_GATEWAY:
                    ex.message = "作为网关或者代理工作的服务器尝试执行请求时，从上游服务器接收到无效的响应";
                    break;
                case SERVICE_UNAVAILABLE:
                    ex.message = "由于临时的服务器维护或者过载，服务器当前无法处理请求";
                    break;
                default:
                    ex.message = "网络错误";  //其它均视为网络错误
                    break;
            }
            return ex;
// Path: app/src/main/java/york/com/retrofit2rxjavademo/http/exception/ApiException.java
// public class ApiException extends Exception {
//     // 异常处理，为速度，不必要设置getter和setter
//     public int code;
//     public String message;
// 
//     public ApiException(Throwable throwable, int code) {
//         super(throwable);
//         this.code = code;
//     }
// }
// 
// Path: app/src/main/java/york/com/retrofit2rxjavademo/http/exception/ErrorType.java
// public interface ErrorType {
//     /**
//      * 正常
//      */
//     int SUCCESS = 0;
//     /**
//      * 未知错误
//      */
//     int UNKNOWN = 1000;
//     /**
//      * 解析错误
//      */
//     int PARSE_ERROR = 1001;
//     /**
//      * 网络错误
//      */
//     int NETWORD_ERROR = 1002;
//     /**
//      * 协议出错
//      */
//     int HTTP_ERROR = 1003;
// }
// 
// Path: app/src/main/java/york/com/retrofit2rxjavademo/http/exception/ServerException.java
// public class ServerException extends RuntimeException{
//     // 异常处理，为速度，不必要设置getter和setter
//     public int code;
//     public String message;
// 
//     public ServerException(String message, int code) {
//         super(message);
//         this.code = code;
//         this.message = message;
//     }
// }


// Path: app/src/main/java/york/com/retrofit2rxjavademo/http/ExceptionEngine.java
import android.net.ParseException;
import com.google.gson.JsonParseException;
import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import retrofit2.adapter.rxjava.HttpException;
import york.com.retrofit2rxjavademo.http.exception.ApiException;
import york.com.retrofit2rxjavademo.http.exception.ErrorType;
import york.com.retrofit2rxjavademo.http.exception.ServerException;

            switch(httpException.code()){
                case UNAUTHORIZED:
                    ex.message = "当前请求需要用户验证";
                    break;
                case FORBIDDEN:
                    ex.message = "服务器已经理解请求，但是拒绝执行它";
                    break;
                case NOT_FOUND:
                    ex.message = "服务器异常，请稍后再试";
                    break;
                case REQUEST_TIMEOUT:
                    ex.message = "请求超时";
                    break;
                case GATEWAY_TIMEOUT:
                    ex.message = "作为网关或者代理工作的服务器尝试执行请求时，未能及时从上游服务器（URI标识出的服务器，例如HTTP、FTP、LDAP）或者辅助服务器（例如DNS）收到响应";
                    break;
                case INTERNAL_SERVER_ERROR:
                    ex.message = "服务器遇到了一个未曾预料的状况，导致了它无法完成对请求的处理";
                    break;
                case BAD_GATEWAY:
                    ex.message = "作为网关或者代理工作的服务器尝试执行请求时，从上游服务器接收到无效的响应";
                    break;
                case SERVICE_UNAVAILABLE:
                    ex.message = "由于临时的服务器维护或者过载，服务器当前无法处理请求";
                    break;
                default:
                    ex.message = "网络错误";  //其它均视为网络错误
                    break;
            }
            return ex;
        } else if (e instanceof ServerException){    //服务器返回的错误