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异步请求你能捕获到异常吗?的更多相关文章

  1. javascript 异步请求封装成同步请求

    此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ...

  2. 解决多次异步请求紊乱问题 - JavaScript

    加入目前的需求这样的:       左边的菜单链接,点击后通过异步请求返回其HTML代码,然后innerHTML到右面的DIV中,加入切换菜单的速度非常快,最终会导致请求紊乱. 可以加入消息管理机制, ...

  3. 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求

    转http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro2/ 掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求 ...

  4. JavaScript异步并发请求问题

    JavaScript异步并发请求问题 JS中如何处理多个ajax并发请求? jQuery的deferred对象详解 面试遇到的ajax请求串行和并行问题

  5. JavaScript 之 异步请求

    一. 1.异步(async) 异步,它的孪生兄弟--同步(Synchronous),"同步模式"就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排 ...

  6. [TimLinux] JavaScript 取消异步请求

    1. xhr.abort() 这个函数可以用来取消XMLHttpRequest()发起的异步请求,不是xhr.close()哦. 2. 场景 比如说,在关闭一个模态框后,数据可能还没有过来,这个时候需 ...

  7. javascript for循环+异步请求导致请求顺序不一致

    工作中遇到一个问题 for循环,再把循环出来的ID再进行二次请求 这就导致一个问题 请求结果返回顺序不一致 原因:异步请求会把回调事件放入微任务事件队列,宏任务执行完毕再执行微任务,具体参考事件队列机 ...

  8. 【转】JavaScript 异步进化史

    前言 JS 中最基础的异步调用方式是 callback,它将回调函数 callback 传给异步 API,由浏览器或 Node 在异步完成后,通知 JS 引擎调用 callback.对于简单的异步操作 ...

  9. 5分种让你了解javascript异步编程的前世今生,从onclick到await/async

      javascript与异步编程 为了避免资源管理等复杂性的问题,javascript被设计为单线程的语言,即使有了html5 worker,也不能直接访问dom. javascript 设计之初是 ...

随机推荐

  1. CF198 D2

    B. Maximal Area Quadrilateral 题意:在N个点中构建四边形,使得四边形面积最大,且不自交. 分析:不自交四边形可以剖分成两个三角形,因此可以在O(N^2)内枚举对角线,然后 ...

  2. 9、JPA_映射双向一对一的关联关系

    双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系.则Manager实体类中有Department实体对象的引用,反之亦然. 其实体属性定义如下: Lis ...

  3. Linux下拆分大文件

    linux split 命令 功能说明:切割文件. 语 法:split [--help][--version][-<行数>][-b <字节>][-C <字节>][- ...

  4. BZOJ 1297 迷路(矩阵)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1297 题意:给出一个带权有向图,权值为1-9,顶点个数最多为10.从1出发恰好在T时刻到 ...

  5. junit浅学笔记

    JUnit是一个回归测试框架(regression testing framework).Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(Wh ...

  6. hdu 2372 El Dorado (dp)

    题目链接 题意:给n个数字, 求有k个数字的上升子序列有多少种. 思路:d[i][j]表示 以第i个元素为 子序列的最后一个元素,长度为j的子序列 有多少种. 比赛的时候 光想着用组合数做了..... ...

  7. HNOI2010弹飞绵羊

    不得不说块状数组好神奇的啊!这道题的标签可是splay的启发是合并(什么高大上的东西),竟然这么轻松的就解决了! var x,y,i,j,tot,n,m,ch:longint; f,k,l,bl,go ...

  8. ajax上传图片 jquery插件 jquery.form.js 的方法 ajaxSubmit; AjaxForm与AjaxSubmit的差异

    先引入脚本  这里最好是把jquery的脚本升级到1.7 <script src="js/jquery-1.7.js" type="text/javascript& ...

  9. Jquery 模板插件 jquery.tmpl.js 的使用方法(2):嵌套each循环,temp调用(使用预编译的模板缓存)

    直接上代码吧 一:主窗口 /*#region SendChooseTargetTemplate 发送候选人主窗口模板*/ var SendChooseTargetTemplate = ''; Send ...

  10. django - 好的 获取 参数值 方法

    第一步: # 参数列表 parameters = ('user_id', 'day_time', 'normal_data', 'hourly_data', 'product_id') # 需要传入的 ...