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 设计之初是 ...
随机推荐
- 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录
原文 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录 首先说说 IDEA 12,由于myeclipse越来越卡,我改用idea12 了,发现其功能强悍 ...
- Java文件解压
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...
- NSArray 利用数组创建数组
NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3", nil]; ...
- Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported
打开navigator,修改下面的classpath文件: 将<classpathentry kind="con" path="org.maven.ide.ecli ...
- 写给系统管理员的25个PHP安全实践
PHP是广泛使用的开源服务端脚本语言.通过HTTP或HTTPS协议,Apache Web服务允许用户访问文件或内容.服务端脚本语言的错误配置会导致各种问题.因此,PHP应该小心使用.以下是为系统管理员 ...
- ubuntu下安装Ming的教程
Ming是一个操纵swf(flash movice)的C库,支持php. ruby. python等语言. 重要提示: 在安装Ming之前,应该准备好你的系统,特别是Linux/Unix系统,如果你对 ...
- Android UI开发第三十篇——使用Fragment构建灵活的桌面
http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...
- 将Ftp添加到资源管理器中直接使用
在资源管理器中,右键,添加网络位置. 然后输入ftp的url ftp://server2008 使用匿名方式登录
- CFF前端沙龙总结
一. -OOCSS + Sass ——大漠 1. OOCSS 结构<=>皮肤 分离 容器<=>内容 分离 2. Sass 工具.处理器 SCSS(CSS风格)<=> ...
- NGUI监听事件
using UnityEngine; using System.Collections; public class UIDataHandler : MonoBehaviour { public UII ...