前端JS 异常处理实践

前端异常处理,常见的场景是在“异步请求”的操作过程当中,所谓“异常”---就是“不正常”,程序的运行不符合我们的预期。

程序“正常”的处理,是我们在开发过程当中的“重中之重”,是必要的“硬性指标”。

而“异常处理”,很多时候可能连“指标”都没有,更谈不上什么“硬性指标”了,所以,在开发当中是很容易被忽略的一个“主题”。

但是,“提高用户体验”与“提高程序可控性”又是两个永恒的主题,“枝繁叶茂”就是我们追求的目标(枝---主功能;叶---细节;)。

在追求“枝繁叶茂”的过程当中,“异常处理”就是细节当中的重中之重,故此,对此进行了如下实践:

常见的“异步请求”操作:1.ajax(以$.ajax为例);2.fetch;

此处对这两种方式的“异常处理”进行了实践(包括try,catch,finally,throw error,new Error(),console.error的运用),以fetch实践为主,由于fetch返回的实际上是promise对象,为了方便查看测试效果,此处直接使用promise对象代替说明。

一.$.ajax相关

$.ajax({
   url: "/hello?name=平凡视界",
   type: "GET",
   success: (data) =>{
    //成功相关处理
    console.log(‘返回数据‘,data)
   },
   error: (err) =>{
    //错误相关处理 404属于该处理(经测试)
    //还可能是"timeout", "error", "notmodified" 和 "parsererror"。
    console.log(‘错误处理‘,err);
   }
 });

二.fetch相关

实践1:当程序运行遇到 throw error 时,JS引擎会停止后续业务执行,程序直接进入catch环节;

new Promise((res, rej) =>{
  console.log(‘异步开始。。。‘);
  setTimeout(() =>{
    const error = new Error(‘粗错啦~‘);
    throw error; //JS引擎会停止后续业务执行,程序直接进入catch环节
    res(‘异步OK‘);
  },3000)
 })
 .then((data) =>{
  console.log(‘异步执行OK‘,data);//并没有执行
 },(data) =>{
  console.log(‘异步执行拒绝‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘二次then执行OK‘,data);//并没有执行
 })
 .catch((err) =>{
  console.error(‘嘿‘,err);//执行OK
 })

实践2:当程序 resolve 时,在后续then操作当中注册的resolve handle会顺次执行,注册的reject handle与catch并未执行;

new Promise((res, rej) =>{
  console.log(‘异步开始。。。‘);
  setTimeout(() =>{
    res(‘异步OK‘);
  },3000)
 })
 .then((data) =>{
  console.log(‘异步执行OK‘,data);//执行OK
 },(data) =>{
  console.log(‘异步执行拒绝‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘二次then执行OK‘,data);//执行OK
 })
 .catch((err) =>{
  console.error(‘嘿‘,err);//并没有执行
 })

实践3:当程序 reject 时,在后续“子1级”then操作当中注册的reject handle执行---验证1,其他注册的resolve handle与catch并未执行;

new Promise((res, rej) =>{
  console.log(‘异步开始。。。‘);
  setTimeout(() =>{
    rej(‘异步失败‘);
  },3000)
 })
 .then((data) =>{
  console.log(‘异步执行OK‘,data);//并没有执行
 },(data) =>{
  console.log(‘异步执行拒绝‘,data);//执行OK
 })
 .then((data) =>{
  console.log(‘二次then执行OK‘,data);//执行OK
 })
 .catch((err) =>{
  console.error(‘嘿‘,err);//并没有执行
 })

实践4:当程序 reject 时,在后续“子2级”then操作当中注册的reject handle执行---验证2(子1级中,并没有注册reject handle相关的处理机制,故被在“子2级”then操作当中注册的reject handle接收,并执行处理),其他注册的resolve handle与catch并未执行;

new Promise((res, rej) =>{
  console.log(‘异步开始。。。‘);
  setTimeout(() =>{
    rej(‘异步失败‘);
  },3000)
 })
 .then((data) =>{
  console.log(‘异步执行OK‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘二次then执行OK‘,data);//并没有执行
 },(data) =>{
  console.log(‘二次then"接收"reject异步"执行结果"(拒绝)‘,data);//执行OK
 })
 .catch((err) =>{
  console.error(‘嘿‘,err);//并没有执行
 })

实践5:当程序 reject 时,在后续“子4级”then操作当中注册的reject handle执行---验证2(“子1级”至“子3级”中,并没有注册reject handle相关的处理机制,故被在“子4级”then操作当中注册的reject handle接收,并执行处理),其他注册的resolve handle与catch并未执行;

new Promise((res, rej) =>{
  console.log(‘异步开始。。。‘);
  setTimeout(() =>{
    rej(‘异步失败‘);
  },3000)
 })
 .then((data) =>{
  console.log(‘异步执行OK1‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘异步执行OK2‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘异步执行OK3‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘二次then执行OK4‘,data);//并没有执行
 },(data) =>{
  console.log(‘二次then"接收"reject异步"执行结果"(拒绝)‘,data);//执行OK
 })
 .catch((err) =>{
  console.error(‘嘿‘,err);//并没有执行
 })

实践6:当程序 reject 时,“子1级”至“子4级”中,并没有注册reject handle相关的处理机制,故被catch接收,并执行处理,其他注册的resolve handle并未执行;

new Promise((res, rej) =>{
  console.log(‘异步开始。。。‘);
  setTimeout(() =>{
    rej(‘异步失败‘);
  },3000)
 })
 .then((data) =>{
  console.log(‘异步执行OK1‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘异步执行OK2‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘异步执行OK3‘,data);//并没有执行
 })
 .then((data) =>{
  console.log(‘异步执行OK4‘,data);//并没有执行
 })
 .catch((err) =>{
  console.error(‘嘿‘,err);//执行OK-----rej的时候,“其后程序”没有对rejct进行相应处理时,
  //catch会接收该reject响应,并进行处理
 })

三.try,catch,finally,throw error,new Error(),console.error的运用;

try{
  console.log("test");
  throw new Error(‘出错了吧?‘);//throw 后面的参数,会被catch中的e接收
}
catch(e){
  // e == ‘出错了吧?‘
  console.error(e);// 出错了吧?
}
finally{
  console.log(‘怎么都会执行‘);// 执行OK
}

四.总结

1.当程序执行遇到“throw error”时,JS引擎会停止后续业务执行,程序直接进入catch环节;

(promise对象,try包裹的代码块)

2.promise:

--- resolve:

大多时候(除:网络故障与请求被阻止外),使用fetch()返回的 Promise被标记为resolve,

包括(接收到一个代表错误的 HTTP 状态码时,HTTP 响应的状态码是 404 或 500,但是,此时会将 resolve 的返回值的 ok 属性设置为 false,

如果需要进行细分,可以根据该属性进行细分---在“异步请求”中,处理的大多数异常或error针对该阶段异常)

--- reject:

使用fetch()返回的 Promise被标记为 reject的情况仅有两种(1.网络故障;2.请求被阻止(如“跨域”))

说明:当程序在reject时,如果后续没有注册“相关程序”来接收处理,那么,该reject会被catch处理,在该reject发生之后注册的一切reslove 业务将不会被执行;

当程序在reject时,如果后续有注册“相关程序”来接收处理,那么,该reject会被所“注册”的函数进行处理,在该注册函数之后的一切reslove 业务不会受该reject的影响,会依次执行,同时,catch不会被“该reject”触发;

3.try catch finally:

try{
#1运行代码
}
catch(err){
#1出错,程序直接进入该环节
}
finally{
#1出错 or 正常,程序都进入该环节
}

原文地址:https://www.cnblogs.com/pfsj/p/10017012.html

时间: 2024-11-10 15:54:41

前端JS 异常处理实践的相关文章

移动端WEB前端开发最佳实践

移动端WEB前端开发最佳实践 Safari,Android Browser,Chrome都是以WebKit为核心的 移动设备和PC之间的页面现实存在差异(Safari中定义了viewport) 在移动设备和桌面端WEB前端开发中,事件绑定存在差异(移动触点) 页面控件设计存差异(点触不灵敏,虚拟键盘弹出框) 移动设备的网络带宽普遍比PC慢,移动页面要设置更简洁 PC页面兼容移动设备 使用流式布局 借助CSS Media queries(媒体查询)技术 使用合适的图片显示兼容方案 保持页面简洁,不

前端Js框架汇总

一.前端框架库: 1.Zepto.js 地址:http://www.css88.com/doc/zeptojs/ 描述:Zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与jquery有着类似的api. 如果你会用jquery,那么你也会用zepto.关于Zepto认知我也是通过与一位腾讯朋友聊天的时候知道的,只作了些基础的了解. 2.SUI Mobile 地址:http://m.sui.taobao.org 描述:SUI Mobile 是一套基于 Framework7 开

前端Js框架汇总【转】

概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net core 1,mono,xamarin等等,但大多都还在狂吼的阶段.其实一直以来对技术的理解是技术服务于业务和产品,产品又在不同程度的推进着技术的演进. Web.无线.物联网.VR.PC从不同方向推进着技术的融合与微创新.程序员在不同业务场景下的角色互换.而随着node.js的出现语言的角色也在发生着转

前端js插件

jquery jquery官方 版本:v 2.1.0v 1.11.0 yquery 暂停更新 版本: v 1.6v 1.5 v 1.4v 1.3 v 1.2v 1.1 v 1.0 jQuery 原型插件(jquery-*) jquery-drag 版本: latestv 1.1 v 1.0 jquery-dialog 版本: latestv 1.5 v 1.4v 1.3 v 1.2v 1.1 v 1.0 样式:default jquery-scrollable 版本: latestv 1.0 j

关于javaBean中boolean类型变量的set和get注入后传到前端JS中的问题

set和get方法如下: public boolean isLine() {        return isLine;    } public void setLine(boolean isLine) {        this.isLine = isLine;    } 这里的isLine变量名最好不要添加is后缀,改成line.否则在前端Js中引用isLine变量时始终是undefined,经发现,传到前端的变量值名字是line,而不是isLine. 关于javaBean中boolean类

前端JS电商放大镜效果

前端JS电商放大镜效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>26-电商放大镜</title> <style type="text/css"> *{ padding: 0; margin: 0; } #left{ padding: 0; margin: 0; w

java 前端js里的console坑人点

之前做的项目,自己用easyUI做为前端框架,调试的时候用console来显示数据,调试好了之后,给客户现场部署,结果现场是IE浏览器,打开后发现点了菜单后没反应.最终在大牛的指导下,才知道console在IE里根本不支持. 在此做个铭记,希望下次再调试前端js代码后,把console给去掉或者注释掉.

HTML5 file API加canvas实现图片前端JS压缩并上传 (转载)

一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致上传失败风险. 最最重要的体验改进点:省略了图片的再加工成本.很多网站的图片上传功能都会对图片的大小进行限制,尤其是头像上传,限制5M或者2M以内是非常常见的.然后现在的数码设备拍摄功能都非常出众,一张原始图片超过2M几乎是标配,此时如果用户想把手机或相机中的某个得意图片

前端js上传文件 到后端接收文件

下面是前端js代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> <!-- // action="fileupload"对应web.xml中<se