前端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
}
四.总结
try{
#1运行代码
}
catch(err){
#1出错,程序直接进入该环节
}
finally{
#1出错 or 正常,程序都进入该环节
}
前端JS 异常处理实践的更多相关文章
- 前端Js框架汇总
概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net co ...
- web前端开发最佳实践笔记
一.文章开篇 由于最近也比较忙,一方面是忙着公司的事情,另外一方面也是忙着看书和学习,所以没有时间来和大家一起分享知识,现在好了,终于回归博客园的大家庭了,今天我打算来分享一下关于<web前端开 ...
- Web前端优化最佳实践及工具集锦
Web前端优化最佳实践及工具集锦 发表于2013-09-23 19:47| 21315次阅读| 来源Googe & Yahoo| 118 条评论| 作者王果 编译 Web优化Google雅虎P ...
- 前端js文件合并三种方式
最近在思考前端js文件该如何合并,当然不包括不能合并文件,而是我们能合并的文件,想了想应该也只有三种方式. 三个方式如下: 1. 一个大文件,所有js合并成一个大文件,所有页面都引用它. 2. 各个页 ...
- 前端js,css文件合并三种方式,bat命令
前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...
- 前端Js框架 UI框架汇总 特性 适用范围 选择
身为一个资深后端工程师,面对层出不穷的前端框架,总让人眼花缭乱,做一个综合解析贴,从全局着眼,让我们明白各种前端框架的应用范围,为如何选择前端框架,从不同的维度提供一些线索,做为一个长期优化贴,欢迎指 ...
- 前端Js框架汇总【转】
概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net co ...
- WEB前端JS与UI框架
前端Js框架汇总 概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人 ...
- 前端Js框架汇总(工具多看)
前端Js框架汇总(工具多看) 一.总结 一句话总结: 二.前端Js框架汇总 概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领 ...
随机推荐
- /etc/default/useradd文件内容及对应功能
1.GROUP=100 #依赖于/etc/login.defs的USE RGRUUPS_ENAB参数,如果为no,则在此处控制 2.HOME=/home #把用户的家路径健在/home中 3.INAC ...
- yii2-dingtalk 钉钉群机器人
说明 群机器人是钉钉群的高级扩展功能.群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.目前,大部分机器人在添加后,还需要进行Webhook配置,才可正常使用(配置说明详见操作流程中的 ...
- TFRecords转化和读取
标准TensorFlow格式 TensorFlow的训练过程其实就是大量的数据在网络中不断流动的过程,而数据的来源在官方文档[^1](API r1.2)中介绍了三种方式,分别是: Feeding.通过 ...
- java陷阱之spring事物未提交和回滚导致不可预知问题
案发现场 //防止全局配置了 所以这里定义sprnig 不托管事物 @Transactional(propagation = Propagation.NOT_SUPPORTED) public boo ...
- 俄罗斯方块c/c++语言代码
/*******************************/ /******Writer: GJ *******/ /******Language: C *******/ /******Date ...
- [SharePoint2010开发入门经典]11、与Office集成
本章概要: 1.创建office集成解决方案使用代码或非代码形式 2.使用内容类型作为能映射到文档库的文档 3.使用InfoPath管理表单 4.使用工作流管理业务流程 5.使用office2010服 ...
- 一种基于Qt的可伸缩的全异步C/S架构server实现(五) 单层无中心集群
五.单层无中心集群 对40万用户规模以内的server.使用星形的无中心连接是较为简便的实现方式.分布在各个物理server上的服务进程共同工作.每一个进程承担若干连接.为了实现这个功能,须要解决几个 ...
- 一起talk C栗子吧(第一百一十九回:C语言实例--线程死锁三)
各位看官们.大家好,上一回中咱们说的是线程死锁的样例,这一回咱们继续说该样例.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,由于篇幅的原因我们在上一回仅仅介绍了死锁发生的第一种原因,今天 ...
- itunes connect上传截图提示无法加载文件问题
解决的方法: 图片名字中不能包括汉字,要英文字母或数字.
- kettle 使用excel模板导出数据
通过excel进行高速开发报表: 建设思路: 1.首先制订相关的execl模板. 2.通过etl工具(kettle)能够高速的 将数据库中的数据按excel模板导出成新的excel就可以. 当中ket ...