Javascript异步请求你能捕获到异常吗?
Javascript异步请求你能捕获到异常吗?
异常处理是程序发布之前必须要解决的问题,不经过异常处理的应用会让用户对产品失去信心。在异常处理中,我们一贯的做法是按照函数调用的次序,将异常从数据访问层、业务逻辑层逐层传递至最后的UI层,在该层对所有的异常进行处理。即在底层只管抛出异常,同时将捕获到的异常向上一层再次抛出。用代码表示如下:
|
try{ statement... statement... throw new Error("这是距离底层第二层抛出的异常!"); try{ statement... statement... //抛出异常 throw new Error("这是底层的异常!"); } catch(e){ //将异常抛给上一层程序处理 throw e; } }catch(e){ //将异常继续抛给上一层程序处理 throw e; } |
上述过程中需要注意的是,在异常从底层向UI层传递的过程中,异常链不能断。即中间层要嘛自己对捕获到的异常进行处理,要嘛将其继续抛给上一层程序进行处理;如果不捕获异常或没有将捕获到的异常传递给上一层程序,将造成异常链断裂,上一层程序将无法捕获到底层程序抛出的异常。
在一般情况下,按照上述方法可以将底层程序的异常逐层传递给UI层处理,但是在javascript中有特殊情况,那就是ajax中方法异步调用时,无法在异步调用方法外层捕获到该方法调用时抛出的异常,异步调用方法中的异常只能在该方法内部进行处理,不能将其抛给其上层程序。
这种情况也容易理解,当顶层程序调用一个异步方法时,由于ajax机制顶,层程序无法得知异步函数何时返回,就不能知道该方法何时抛出异常,也就没有办法去捕获该方法抛出的异常,最终导致异常链断裂。
那么如果在异步调用的方法中将异常抛出会出现什么后果呢?答案是程序在异常处自动终止,而用户得不到任何提示。
请看线面的示例,示例试图在异步请求过程中将异常抛给其调用函数,通过单步调试可以看见程序在异步调用函数中捕获到了异常,如果没有那句可爱的”alert”,程序在捕获到异常后将直接终止,而此时UI层没有任何提示,但是对异常进行处理,比如通过alert将异常信息显示出来,结果就不一样了。我们的用户就会看见异常的提示。进而明白是由于哪些原因导致的,他们就不会轻易对系统抱怨!
同时还应当注意的是下面的throw,是将该异常继续抛给上一层程序,来告诉上一层程序此处程序遇到错误不能继续执行,那么上层程序在得知此事之后会终止应用程序。假如不将异常抛出,异常链就会断裂,上层程序还会继续执行,又会应为当前错误导致其它的异常,最终使程序崩溃,到那时展现给用户的可能就是一堆异常提示代码。

异步请求方法中捕获异常

异步请求方法中处理异常
Javascript异步请求你能捕获到异常吗?的更多相关文章
- javascript 异步请求封装成同步请求
此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...
- 解决多次异步请求紊乱问题 - JavaScript
加入目前的需求这样的: 左边的菜单链接,点击后通过异步请求返回其HTML代码,然后innerHTML到右面的DIV中,加入切换菜单的速度非常快,最终会导致请求紊乱. 可以加入消息管理机制, ...
- 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求
转http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 ...
- JavaScript异步并发请求问题
JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题
- JavaScript 之 异步请求
一. 1.异步(async) 异步,它的孪生兄弟--同步(Synchronous),"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排 ...
- [TimLinux] JavaScript 取消异步请求
1. xhr.abort() 这个函数可以用来取消XMLHttpRequest()发起的异步请求,不是xhr.close()哦. 2. 场景 比如说,在关闭一个模态框后,数据可能还没有过来,这个时候需 ...
- javascript for循环+异步请求导致请求顺序不一致
工作中遇到一个问题 for循环,再把循环出来的ID再进行二次请求 这就导致一个问题 请求结果返回顺序不一致 原因:异步请求会把回调事件放入微任务事件队列,宏任务执行完毕再执行微任务,具体参考事件队列机 ...
- 【转】JavaScript 异步进化史
前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...
- 5分种让你了解javascript异步编程的前世今生,从onclick到await/async
javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...
随机推荐
- ubuntu 下搭建vsftp
1. 安装:sudo apt-get install vsftpd 2. 我的目的是建立个ftp,专门的账户访问,账户不可以登陆.不允许匿名登陆 3. 更改配置文件/etc/vsftpd.conf l ...
- HackDemo.java
import java.io.*; import java.awt.*; public class HackDemo{ public static void main(String args[]) t ...
- 72. Edit Distance
题目: Given two words word1 and word2, find the minimum number of steps required to convert word1 to w ...
- Tomcat目录介绍以及运行时寻找class的顺序
来自:http://blog.csdn.net/lihai211/article/details/6651977 Tomcat下的文件目录 /bin:存放启动和关闭tomcat的脚本文件: /conf ...
- linux 命令学习大全
转载 http://blog.csdn.net/xiaoguaihai/article/details/8705992/
- Ubuntu中Eclipse安装与配置
安装Eclipse: 第一种是通过Ubuntu自带的程序安装功能安装Eclipse,应用程序 ->Ubtuntu软件中心,搜Eclipse安装即可.第二种方法是用命令:应用程序->附件-& ...
- 好!recover-binary-search-tree(难)& 两种好的空间O(n)解法 & 空间O(1)解法
https://leetcode.com/mockinterview/session/result/xyc51it/https://leetcode.com/problems/recover-bina ...
- Android百度地图
帖子 热搜: 二维码 聊天 二维码扫描 传感器 游戏 定位 手势绘图 小项目 相框 绘图 涂鸦 拨打电话 记事本 定时器 通话记录 短信群发 listview 音乐播放器 项目例子 百度地 ...
- nginx反向代理的简单配置
有两台机器A和B. A上边是nginx,B上边是tomcat. 现在要通过A的反向代理功能,通过A的nginx访问到B的tomcat. 首先tomcat已经配置好,并且正确启动,可访问. ...
- poj 2373 Dividing the Path
Dividing the Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2858 Accepted: 1064 ...