我们在进行网络应用程序开发时(主要是CS架构的应用程序)要面对很多异常情况的处理,这些异常中有些是服务器端主动抛出的异常,客户端要按照事先约定好的规则分类处理;有些是客户端进行参数合法性检查产生的异常,需要提示给用户知道;还有诸如网络连接异常、数据传输异常等等。要让我们的网络程序框架有足够的弹性,更好的适应未来需求的变化,我们非常有必要将这些异常做一个细致、精确的归类。
依据我个人的开发经验来看,网络应用程序开发过程中的异常主要可以分为3大类,分别是网络异常、本地异常和服务器异常。
网络异常,指由于网络链路问题,无法和服务器建立连接完成通信,或者连接被异常中断(包括发送超时、接收超时等)导致服务无法完成等。产生这类异常的原因主要可以分为2类,一类是客户端没有接入网络,和任何机器都无法建立连接;另一类则是客户端和指定服务器的通信链路不通,通常会产生10060错误码,这个原因可能是服务器故障或宕机造成无法响应客户端连接请求,或者是由于通信线路问题无法和服务器建立连接(网络拥塞、跨地区、跨运营商设备等原因引起)。对于第二类问题,我们通常可以采用重试机制,尝试解决建立连接的问题,尤其是在网络高峰时段、服务器负载过重的情况下,这种方式就显得尤为重要。
本地异常,通常是由本地应用程序主动生成并抛出的异常,主要指参数合法性检查失败、业务逻辑处理时产生的异常等信息,这类异常主要起提示用户的作用。比如我们在做文件下载功能时,通常需要对已经下载完成的文件进行MD5码校验,以检查网络下载过程中是否发生错误,如果MD5校验失败,我们客户端应用程序就要主动抛出“文件数据传输出错”的异常,这一类异常通常不需要重试机制。
服务器异常,顾名思义,指通信过程中服务器端抛出的异常,主要分为预定义异常和非预定义异常。预定义异常通常带有异常码、错误提示及附加参数等信息,由客户端和服务器端协商确定,客户端收到预定义异常时,需要根据具体的异常码进行处理,比如账户异常时,需要弹出一个账户密码输入对话框出来,用户可以修改账户密码后重试也可以取消操作;再如客户端收到未购买VIP服务异常时,需要弹出一个带有购买VIP服务链接的对话框出来等等。非预定义异常是指服务器应用未处理的异常,由webservice框架,或者直接由web容器抛出的异常,产生这类异常可能是因为服务器应用程序对可以预期的异常忘记进行处理(开发和测试过程中应解决),或者服务器系统运行时产生了异常(系统负载过重、打开文件描述符个数过多等)。针对非预定义异常(我们假设非预定义异常均由服务器系统运行时异常导致),我们也应该采用重试机制,这样可以在一定程序上提高网络服务的成功率。
注意,这里提到的网络异常、服务器异常中的非预定义异常的定义,都是假设在服务应用程序代码没有错误的前提下进行的。正确的定义异常,对我们决定是否启用重试机制非常重要,如果是服务器端代码错误,导致网络异常、或非预定义异常产生,客户端即使重试1000次终究还是失败!
标签:程序开发,网络,重试,预定,CS,服务器,异常,客户端 From: https://blog.51cto.com/u_11295556/5907113