一、错误处理流程概览从这个错误处理流程可知,在整个错误处理的过程中,一共可以分为3条主要的流程:请求解析异常流程处理,平台级错误处理和业务调用错误处理。当然,这一切处理的最初也是最重要的一步就是:将服务器响应内容保留下来。二、服务器响应内容透析服务器响应内容,顾名思义就是isv调用top服务得到的响应的内容。这些内容能够最真实的反应出isv请求的问题和服务器当前的情况,也最能够帮助isv找到问题的所在。服务器响应内容一般分为两种:一种是wiki文档中所编写的成功调用所返回的字段,另一种是调用失败的返回的错误相关信息。1.调用成功返回格式调用成功的响应信息内容根据调用服务版本的不同分为了两种不同的格式。1.0的服务返回信息的格式分为三层:最外一层是rsp:{}标记,表示这是服务的响应内容;中间一层是返回结构体的标记,如:返回的是商品的结构体,中间这层就是items:[{},{}……],表示结果是一个商品的列表,如果返回参数不是以结构体的形式,这一层就不存在;最内一层就是每个结构体具体的字段了。1.0这个版本所有返回结果,不论是单个的商品还是一个商品列表,他的第二层都是一个列表的结构,区别只是列表里有一个子结构体还是有多个子结构体而已。相比之下,2.0的服务返回信息就相对的规范化了。2.0的响应内容主要也可以分为3层:最外一层是你调用服务的名称所对应的响应标记,如:获取单个商品(taobao.item.get)的响应最外层为item_get_response:{},表示这是获取单个商品的响应;中间一层是返回结构体的标记。如果结构体是单个,那么2.0返回的这一层里面就会是单个的结构,如:获取的单个商品的结构体就是item:{};反之,如果结构体是多个,那么列表也会明显的表示出来,如:搜索商品列表的结构体就会是”items”:{“item”:[{},{}……]}。最外层的items表示这是一个商品的列表,后面的item表示列表中的每一个子结构体都是属于商品item的,然后就跟着商品的数据;最内一层就商品的具体字段信息了。2.调用错误返回当调用发生错误的时候,一般情况下可以分为几大类错误信息的返回:http连接错误、平台解析错误、业务处理错误。这三种类型的错误分别代表了:淘宝服务器、淘宝接入平台、top-api业务,几个层次上出现的问题。1)http连接错误http连接错误是请求通信过程中出现的错误,这类型错误通常由http响应码标记出来。http响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。响应码分五种类型,由它们的第一位数字表示:1xx:信息,请求收到,继续处理2xx:成功,行为被成功地接受、理解和采纳3xx:重定向,为了完成请求,必须进一步执行的动作4xx:客户端错误,请求包含语法错误或者请求无法实现5xx:服务器错误,服务器不能实现一种明显无效的请求Isv调用top服务最常收到就是200:http请求成功;404:未找到请求的服务;500内部服务器错误等等。如果用户收到的响应码是404,表示用户的网络有问题或者top被和谐了……如果用户收到的响应码是500,表示网络是ok的,是top的服务无法响应。2)服务端错误总述平台解析错误和业务处理错误都是http成功访问到top服务(http响应码返回为200)之后所产生的错信息,他们top处理isv请求过程中出现的问题。1.0和2.0的格式有所不同。1.0的错误响应信息最外层为{“error_rsp”:{}},表示这是调用错误所返回的信息。里面一层包含两个元素:”code”:””和“msg”:””,前者表示错误码是多少,后者表示错误信息是什么。例如错误的调用1.0的taobao.item.get服务错误时返回的错误信息:{error_rsp:{code:40,msg:Missingrequiredarguments:missingparameteriid/num_iid}}。这个信息的开头为error_rsp,表示这是调用错误所返回的结果。里面包含的错误体的code为40,是平台型错误,表示错误是缺少了必传参数所引起的。然后msg内容为Missingrequiredarguments:missingparameteriid/num_iid,表示缺少的必传参数是iid或者num_iid。Isv解析到这些信息后就需要根据错误信息改进自己传入的参数来使调用成功。2.0的错误响应信息的最外层为{“error_response”:””},表示这是调用服务失败所返回的错误信息。信息体里面一层总共包含了五个元素:args:{arg:[{“key”:“”,”value”:””},{“key”:“”,”value”:””},{“key”:“”,”value”:””}……]},”code”:””,“msg”:””,”sub_code”:””和”sub_msg”:””。args表示用户传入的参数列表是什么,里面是一个arg的列表会包含用户传入的所有参数信息,每个arg表示一个参数的信息,key表示参数的名称,value表示参数的内容,用以方便用户定位自己的错误;code表示用户调用错误的错误码是多少,小于200表示平台级错误,200-1000之间表示大范围的业务错误,即哪一类型的api调用发生了错误(根据api的大类来分,如:商品类的api是530,交易类的api是520,等);msg表示大类型的错误码所对应的错误信息,一般不具备独立的debug作用,需要和sub_code和sub_msg一起使用才行;sub_code是调用错误的子错误码,他表示用户调用错误的原因;sub_msg是子错误码所对应的错误信息,他用来补充细化子错误码的错误原因的。例如调用2.0的taobao.item.get服务错误时返回的错误信息:{error_response:{args:{arg:[{key:app_key,value:15739},{key:fields,value:list_time,delist_time,approve_status},{key:format,value:json},{key:method,value:taobao.item.get},{key:nick,value:tbtest561},{key:partner_id,value:TOPTEST},{key:sign,value:668FB4A049F71A1C845EF8C05B1F3E66},{key:timestamp,value:2010-03-0518:03:06.325},{key:v,value:2.0}]},code:530,msg:Remoteserviceerror,sub_code:missing-parameter,sub_msg:iid和num_iid至少要传入一个}}这个信息的开头为error_response,表示这是调用错误所返回的错误信息。里面的args列出了用调用这个接口传入的信息有:[{key:app_key,value:15739},{key:fields,value:list_time,delist_time,approve_status},{key:format,value:json},{key:method,value:taobao.item.get},{key:nick,value:tbtest561},{key:partner_id,value:TOPTEST},{key:sign,value:668FB4A049F71A1C845EF8C05B1F3E66},{key:timestamp,value:2010-03-0518:03:06.325},{key:v,value:2.0}],这些信息是从用户的请求信息里面解析出来的。错误码code为530,表示这是调用商品的api所产生的错误。错误信息msg为Remoteserviceerror表示这是调用业务处理所产生的错误。子错误码sub_code为:missing-parameter,表示这个错误是因为缺少了参数所产生的。子错误信息sub_msg为:iid和num_iid至少要传入一个,表示少传的参数为iid或num_iid。这所有的错误信息叠加起来可以知道,这个错误是用户调用taobao.item.get接口时业务处理发现用户没有传入商品id所导致的。3)平台解析错误平台解析错误是指top返回的错误码小于100的情况。平台解析是非业务性的普适的校验接入层,主要用于对用户的各种权限、和入参进行最基本的校验。现在的平台错误码主要有:Isv可以通过错误码和解释来纠正问题。如:错误码为3的响应表示图片上传失败,错误码为26表示用户没有传入session参数,错误码为27表示用户传入的session参数找不到对应的session记录,等等。4)业务处理错误业务处理错误是用户通过平台校验进入业务流程出现了错误所发出来的。这一层的错误码根据调用版本不同分为两种。如果版本是1.0,那么返回的错误信息格式就是:{“error_rsp”:{“code”:XXX,”msg”:”……”}},里面的code是数字形式的标记着一种错误的编码,msg是字符串形式,标记在错误的具体信息。如,获取当商品失败的错误信息就是:{error_rsp:{code:551,msg:Itemserviceunavailable:获取单个商品失败}}。1.0的错误码有以下几种:1.0的返回的错误code就是其中的错误码,错误msg就是其中的英文错误描述加上具体的错误信息组成的。如果版本是2.0,那么服务器所返回的错误信息格式就是:{“error_response”:{args:{arg:[{“key”:“”,”value”:””},{“key”:“”,”value”:””},{“key”:“”,”value”:””}……]},”code”:””,“msg”:””,”sub_code”:””,”sub_msg”:””}},里面的code是数字形式的标记着一种业务类型的错误编码,msg则是比较大范围内的表示错误类型的字符串。而sub_code是以字符串形式粗略表示错误的类型,sub_msg则是表示具体的错误原因。2.0的code包含以下几种分类:产品线错误码用户500类目510交易520退款521商品530商品扩展API531邮费模板532产品540物流550店铺560评价570淘宝客580系统590备案591增量API600比价610画报620江湖630分销640淘秀650收费660Misc(保证金等杂项api)670由上图可知,每一大类的api在2.0中其实是共享一个code的,它能让用户在复杂组合调用中指导是哪一类的api出现了问题,实现初步的定位。2.0的业务错误中,msg里面最容易出现的内容就是Remoteserviceerror,这表示用户是在通过了平台校验后进行业务流程的时候出现的错误。其他的错误还有RemoteServiceTimeout:后台处理业务超时等等的错误。这一个错误信息的力度比较粗,很难单独用她进行错误处理。2.0的业务处理错误信息主要要看sub_code和sub_msg这连个字段。sub_code表示了服务费对业务错误的分类,sub_msg表示了是错误原因。Sub_code根据业务错误类型主要可以分为如下几类子错误码错误归类user-not-exist用户不存在missing-parameter缺少参数invalid-parameter参数错误parameters-mismatch参数不匹配(主要针对那些需要一一对应的入参)Invalid-permission权限不足remote-service-error调用后端服务错误remote-service-timeout调用后端服务超时remote-connection-error调用后端服务连接错误XXX-service-unavailable调用后端服务失败item-ext