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. Photoshop:模拟钢笔压力

    预期效果: 方法: 按B选择画笔工具,设置"钢笔压力" 路径描边:选择路径,右击路径,选择“描边路径” 或在路径面板,选择: 即可得到预期效果!

  2. 【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购

    [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设. 电商的秒杀和抢购,对我们来说,都不是一个陌生的东西. ...

  3. Redis安装教程

    1. Linux下Redis安装教程 (1)安装 #tar xf redis-2.6.14.tar.gz #cd redis-2.6.14 #make #make install (2)配置 修改re ...

  4. Codeforces Round #232 (Div. 2) B. On Corruption and Numbers

    题目:http://codeforces.com/contest/397/problem/B 题意:给一个n ,求能不能在[l, r]的区间内的数字相加得到, 数字可多次重复.. 比赛的时候没有想出来 ...

  5. 【 D3.js 高级系列 — 9.0 】 交互式提示框

    一般来说,图表中不宜存在过多文字.但是,有时需要一些文字来描述某些图形元素.那么,可以实现一种交互:当用户鼠标滑到某图形元素时,出现一个提示框,里面写有描述文字.这是一种简单.普遍的交互式,几乎适用于 ...

  6. MVC&WebForm对照学习:ajax异步请求

    写在前面:由于工作需要,本人刚接触asp.net mvc,虽然webform的项目干过几个.但是也不是很精通.抛开asp.net webform和asp.net mvc的各自优劣和诸多差异先不说.我认 ...

  7. memcachedd基础

    系列文章导航: memcached完全剖析–1. memcached的基础 memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3. memcached的删 ...

  8. 【Mysql】初学命令行指南

    MYSQL初学者使用指南与介绍 一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbi ...

  9. 【转】如何在eclipse里关联查看android源码

    原文网址:http://fengbohaishang.blog.51cto.com/5106297/1339556 以前没怎么注意过这个问题,不怎么看源码,现在发现源码确实是很好的学习资源. 直入正题 ...

  10. MOSS 2010:Visual Studio 2010开发体验(14)——列表开发之事件接收器

    转:http://boke.25k5.com/kan141919.html 通过前面几篇,我们已经完成了内容类型,列表定义,列表实例g 8h"@的开发.本篇继续讲解列表中的一个重要环节- ...