博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异常统一处理的一些思路
阅读量:4286 次
发布时间:2019-05-27

本文共 3097 字,大约阅读时间需要 10 分钟。

1.AppException 统一处理所有异常

//将出现的所有异常都用AppExceptionpublic class AppException extends Exception {
public int statusCode; public String responseMessage; public AppException(int status, String responseMessage) { super(responseMessage); this.statusCode = status; this.responseMessage = responseMessage; } public AppException(String detailMessage) { super(detailMessage); }} //像这样替换 @Override public T parse(HttpURLConnection connection,OnProgressUpdatedListener listener) throws AppException { try { int status = connection.getResponseCode(); if (status == HttpStatus.SC_OK) { ...... }else { //都看作是联网失败 throw new AppException(status,connection.getResponseMessage()); } } catch (Exception e) { throw new AppException(e.getMessage()); } }

2.常见的异常

所有异常

参数错误,403
服务器错误,500
服务器返回json格式不正确,导致反序列化不成功

APPException还可以加在其它地方,eg,请求之前判断URL是否正确if (!URLUtil.isNetworkUrl(request.url)) {        throw new AppException("the url :" + request.url + " is not valid");    }//public static boolean isNetworkUrl(String url) {    if (url == null || url.length() == 0) {        return false;    }    return isHttpUrl(url) || isHttpsUrl(url);}

3.token 失效的解决思路

考虑这样一种场景,当User登录之后很长一段时间都不用登录

方案很多:cookie、session、token
这里看一下 token:

当User登录之后,服务器会返回一个token的字符串,这个字符串是一个UserID + 其它信息的一个MD5

把这个token记录下来,以后所有的请求都会加上这个token,把它解密出来判断是否失效

没有失效,回取出对应ID的所有数据

失效,返回403 + token 失效

//框架里面会写接口,还有请求队列中,我的是Request和RequestTaskpublic interface OnGlobalExceptionListener {
//处理类似 token 失效这类的Exception,错误代码403 boolean handleException(AppException exception);}//Request public OnGlobalExceptionListener onGlobalExceptionListener; public void setGlobalExceptionListener(OnGlobalExceptionListener onGlobalExceptionListener) { this.onGlobalExceptionListener = onGlobalExceptionListener; }//RequestTask @Override protected void onPostExecute(Object o) { super.onPostExecute(o); if (o instanceof AppException) { if (request.onGlobalExceptionListener != null){ if(!request.onGlobalExceptionListener.handleException((AppException)o)){ request.iCallback.onFailure((AppException) o); } } } else { request.iCallback.onSuccess(o); } }

4.自己处理

public class BaseActivity extends ActionBarActivity implements OnGlobalExceptionListener {
@Override public boolean handleException(AppException e) { if (e.statusCode == 403) {
//服务器拒绝访问 if("token invalid".equals(e.responseMessage)) {// TODO relogin return true; } } return false; }}
@Override public void onFailure(AppException e) {     if (e.statusCode == 403) {        if ("password incorrect".equals(e.responseMessage)) {//                        TODO        } else if ("token invalid".equals(e.responseMessage)) {//                        TODO relogin        }     }     e.printStackTrace();}

转载地址:http://yxpgi.baihongyu.com/

你可能感兴趣的文章
iOS设备唯一标识保存、钥匙串
查看>>
iOS判断网络
查看>>
iOS需要学习和解决的若干问题-----------------
查看>>
iOS 十进制转换成十六进制
查看>>
PHP 基础五
查看>>
PHP基础六 数组
查看>>
iOS 判断手机上是否装了某款软件
查看>>
PHP 数据库mysql(一)命令行操作数据库
查看>>
iOS CLRegion监听区域
查看>>
iOS之UIApplecation和appdelegate的使用
查看>>
iOS中app设计、自动登录的设计
查看>>
PHP数据库mysql(二)增删改查
查看>>
javascript(一)
查看>>
javascript(二)之HTMLDOM
查看>>
javascript(三)之对象
查看>>
javascript(四)之window
查看>>
javascript(五)之框架
查看>>
WKWebView 和UIWebView、网页缓存、网路请求缓存
查看>>
Javascript (六)高级之ECMAScript
查看>>
iOS之UISCrollView--原理
查看>>