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. ubuntu 下搭建vsftp

    1. 安装:sudo apt-get install vsftpd 2. 我的目的是建立个ftp,专门的账户访问,账户不可以登陆.不允许匿名登陆 3. 更改配置文件/etc/vsftpd.conf l ...

  2. HackDemo.java

    import java.io.*; import java.awt.*; public class HackDemo{ public static void main(String args[]) t ...

  3. 72. Edit Distance

    题目: Given two words word1 and word2, find the minimum number of steps required to convert word1 to w ...

  4. Tomcat目录介绍以及运行时寻找class的顺序

    来自:http://blog.csdn.net/lihai211/article/details/6651977 Tomcat下的文件目录 /bin:存放启动和关闭tomcat的脚本文件: /conf ...

  5. linux 命令学习大全

    转载  http://blog.csdn.net/xiaoguaihai/article/details/8705992/

  6. Ubuntu中Eclipse安装与配置

    安装Eclipse: 第一种是通过Ubuntu自带的程序安装功能安装Eclipse,应用程序 ->Ubtuntu软件中心,搜Eclipse安装即可.第二种方法是用命令:应用程序->附件-& ...

  7. 好!recover-binary-search-tree(难)& 两种好的空间O(n)解法 & 空间O(1)解法

    https://leetcode.com/mockinterview/session/result/xyc51it/https://leetcode.com/problems/recover-bina ...

  8. Android百度地图

        帖子   热搜: 二维码 聊天 二维码扫描 传感器 游戏 定位 手势绘图 小项目 相框 绘图 涂鸦 拨打电话 记事本 定时器 通话记录 短信群发 listview 音乐播放器 项目例子 百度地 ...

  9. nginx反向代理的简单配置

    有两台机器A和B. A上边是nginx,B上边是tomcat. 现在要通过A的反向代理功能,通过A的nginx访问到B的tomcat. 首先tomcat已经配置好,并且正确启动,可访问.       ...

  10. poj 2373 Dividing the Path

    Dividing the Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2858   Accepted: 1064 ...