(72)Wangdao.com第十二天_JavaScript 错误处理机制
1. Error 实例对象
JavaScript 解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。
JavaScript 原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例。
var err = new Error('出错了');
err.message // "出错了"抛出
Error实例对象以后,整个程序就中断在发生错误的地方,不再往下执行
- 属性
- .message 错误提示信息
- .name 错误名称 ( 非标准属性 )
- .stack 错误的堆栈 ( 非标准属性 )
function throwit() {
throw new Error('');
} function catchit() {
try {
throwit();
} catch(e) {
console.log(e.stack); // print stack trace
}
} catchit()// Error
// at throwit (~/examples/throwcatch.js:9:11)
// at catchit (~/examples/throwcatch.js:3:9)
// at repl:1:5// 错误堆栈的最内层是
throwit函数
// 然后是catchit函数
// 最后是函数的运行环境
- 大多数 JavaScript 引擎,对
Error实例还提供name和stack属性,分别表示错误的名称和错误的堆栈,但它们是非标准的,不是每种实现都有
2. 原生错误类型
Error实例对象是最一般的错误类型,
在 Error 的基础上,JavaScript 还定义了 Error 的 6 个派生对象
// 开发者可以使用它们,手动生成错误对象的实例
var err1 = new Error('出错了!');
var err2 = new RangeError('出错了,变量超出有效范围!');
var err3 = new TypeError('出错了,变量类型无效!'); err1.message // "出错了!"
err2.message // "出错了,变量超出有效范围!"
err3.message // "出错了,变量类型无效!"SyntaxError对象 是解析代码时发生的语法错误// 变量名错误
var 1a; // Uncaught SyntaxError: Invalid or unexpected token // 缺少括号
console.log 'hello'); // Uncaught SyntaxError: Unexpected string // 上面代码的错误,都是在语法解析阶段就可以发现,所以会抛出 SyntaxError
// 第一个错误提示是“token 非法”,
// 第二个错误提示是“字符串不符合要求”
ReferenceError对象 是引用一个不存在的变量时发生的错误- 使用一个不存在的变量
- 将一个值赋予无法分配的对象
RangeError对象 是一个值超出有效范围时发生的错误。- 数组长度为负数
Number对象的方法参数超出范围- 函数堆栈超过最大值
TypeError对象 是变量或参数不是预期类型时发生的错误- 对字符串、布尔值、数值等原始类型的值使用
new命令, 就会抛出这种错误,因为new命令的参数应该是一个构造函数 - 调用对象不存在的方法,也会抛出
TypeError错误
- 对字符串、布尔值、数值等原始类型的值使用
URIError对象 是 URI 相关函数的参数不正确时抛出的错误- 主要涉及
encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数
- 主要涉及
EvalError对象 是 eval函数 没有被正确执行时,会抛出EvalError- 该错误类型已经不再使用了,只是为了保证与以前代码兼容,才继续保留
3. 自定义错误
除了 JavaScript 原生提供的七种错误对象,还可以定义自己的错误对象
function UserError(message) {
this.message = message || '默认信息';
this.name = 'UserError';
} UserError.prototype = new Error();
UserError.prototype.constructor = UserError; // 上面代码自定义一个错误对象UserError,让它继承Error对象。然后,就可以生成这种自定义类型的错误了var mineErr = new UserError('这是自定义的错误!');//throw也可以抛出自定义错误throw new UserError('出错了!');
4. throw 中断程序,抛出错误
throw语句的作用是手动中断程序执行,抛出一个错误
if (x <= 0) {
throw new Error('x 必须为正数');
}
// Uncaught ReferenceError: x is not defined- t
hrow可以抛出任何类型的值。也就是说,它的参数可以是任何值 - 引擎会接收到
throw抛出的信息,可能是一个错误实例,也可能是其他类型的值
5. try...catch
JavaScript 提供了try...catch结构,允许对错误进行处理,选择是否往下执行
try代码块抛出错误(上例用的是throw语句),JavaScript 引擎就立即把代码的执行,转到catch代码块,或者说错误被catch代码块捕获了。catch接受一个参数,表示try代码块抛出的值try {
throw new Error('出错了!');
} catch (e) {
console.log(e.name + ": " + e.message);
console.log(e.stack);
}
// Error: 出错了!
// at <anonymous>:3:9
// ...
catch代码块捕获错误之后,程序不会中断,会按照正常流程继续执行下去try {
throw "出错了";
} catch (e) {
console.log(111);
}
console.log(222);
//
//
catch代码块之中,还可以再抛出错误,甚至使用嵌套的try...catch结构var n = 100; try {
throw n;
} catch (e) {
if (e <= 50) {
// ...
} else {
throw e;
}
}
// Uncaught 100
- 为了捕捉不同类型的错误,
catch代码块之中可以加入判断语句try {
foo.bar();
} catch (e) {
if (e instanceof EvalError) { // 判断错误类型(EvalError还是RangeError),进行不同的处理
console.log(e.name + ": " + e.message);
} else if (e instanceof RangeError) {
console.log(e.name + ": " + e.message);
}
// ...
}
6. finnally 代码块
try...catch结构允许在最后添加一个finally代码块,表示不管是否出现错误,都必需在最后运行的语句
function cleansUp() {
try {
throw new Error('出错了……');
console.log('此行不会执行');
} finally {
console.log('完成清理工作');
}
} cleansUp()
// 完成清理工作
// Error: 出错了……finally代码块用法的典型场景openFile(); try {
writeFile(Data);
} catch(e) {
handleError(e);
} finally {
closeFile();
}首先打开一个文件,然后在
try代码块中写入文件,如果没有发生错误,则运行finally代码块关闭文件;一旦发生错误,则先使用catch代码块处理错误,再使用finally代码块关闭文件
try...catch...finally这三者之间的执行顺序function f() {
try {
console.log(0);
throw 'bug';
} catch(e) {
console.log(1);
return true; // 这句原本会延迟到 finally 代码块结束再执行
console.log(2); // 不会运行
} finally {
console.log(3);
return false; // 这句会覆盖掉前面那句 return
console.log(4); // 不会运行
} console.log(5); // 不会运行
} var result = f();
//
//
// result
// false
(72)Wangdao.com第十二天_JavaScript 错误处理机制的更多相关文章
- (73)Wangdao.com第十二天_JavaScript consol 对象与控制台
consol 对象 console对象是 JavaScript 的原生对象 它有点像 Unix 系统的标准输出stdout和标准错误stderr, 可以输出各种信息到控制台,并且还提供了很多有用的辅助 ...
- (89)Wangdao.com第二十二天_JavaScript 属性
属性 属性本身是一个对象(Attr 对象) Element.attributes 返回一个类似数组的动态对象,成员是该元素标签的所有属性节点对象 属性的实时变化都会反映在这个节点对象上. 其他类型的 ...
- (89)Wangdao.com第二十二天_JavaScript DocumentFragment 节点
DocumentFragment 节点 代表一个文档的片段,本身就是一个完整的 DOM 树形结构. 它没有父节点,.parentNode 返回 null 可以插入任意数量的子节点. 不属于当前文档,操 ...
- linux系统编程之错误处理机制
在讲解liunx错误处理机制之前我们先来看一段代码: #include<sys/types.h> #include<sys/stat.h> #include<fcntl. ...
- javascript中的错误处理机制
× 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ...
- Map/Reduce 工作机制分析 --- 错误处理机制
前言 对于Hadoop集群来说,节点损坏是非常常见的现象. 而Hadoop一个很大的特点就是某个节点的损坏,不会影响到整个分布式任务的运行. 下面就来分析Hadoop平台是如何做到的. 硬件故障 硬件 ...
- Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制
本文主要介绍WebRTC视频通信中的错误恢复机制(我们翻译和整理的,译者:jiangpeng),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blac ...
- PHP异常与错误处理机制
先区别一下php中错误 与 异常的概念吧 PHP错误:是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况.平时遇到的warming.notice ...
- ASP.NET的错误处理机制之一(概念)
对Web应用程序来说,发生不可预知的错误和异常在所难免,我们必须为Web程序提供错误处理机制.当错误发生时,我们必须做好两件事情:一是将错误信息记录日志,发邮件通知网站维护人员,方便技术人员对错误进行 ...
随机推荐
- Django小技巧——使用package管理app
在一个学习视频上看见的小技巧,遂记录下来. 1. 如下图所示,项目中有多个app,本技巧要解决的问题是集中管理这多个app,将其放入一个package下集中管理,改善项目的视图环境 2. 建立一个pa ...
- 有趣的若干个AI项目
一.遗传算法跑贪吃蛇 1.下载processing,下载地址是:https://processing.org/download ,直接解压打开即可. 2.下载SnakeAI源码,下载地址是:https ...
- L1-Day3
L1-Day31.太阳从西边落下. [我的翻译]The sun falls in the west. [标准答案]The sun sets in the west. [对比分析]落下fall与set的 ...
- python从爬虫基础到爬取网络小说实例
一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...
- Node.js使用jszip实现打包zip压缩包
一.前言 最近有这样的一个需求,需要把两个同名的.mtl文件和.obj文件打包成一个同名的.zip压缩包.刚开始文件不多的时候,只有几个,或者十几个,甚至二三十个的时候,还能勉强接受手动修改,但是随着 ...
- Faster RCNN 学习笔记
下面的介绍都是基于VGG16 的Faster RCNN网络,各网络的差异在于Conv layers层提取特征时有细微差异,至于后续的RPN层.Pooling层及全连接的分类和目标定位基本相同. 一). ...
- 【转】利用apktool反编译apk,并且重新签名打包
网站:https://ibotpeaches.github.io/Apktool,下载安装好apktool. 我的安装在 C:\Users\Administrator\Downloads\apktoo ...
- Linux 首先基本包安装(vim啊什么的),源,源优化,项目架构介绍, (LNMuWsgi)Django项目相关软件mysql,redies,python(相关模块)安装配置测试
内容 补充: 查看已启动服务的端口 netstat -tulnp |grep (方式1) ss -tulnp|grep (方式2) 前期铺垫: . Linux要能上网 . 掌握Linux软件包安装方法 ...
- 忘记加入spring-aop-4.3.16.RELEASE.jar出错
出错代码: java.lang.NoClassDefFoundError: org/springframework/aop/framework/AopProxyUtils at org.springf ...
- 论文阅读笔记四十二:Going deeper with convolutions (Inception V1 CVPR2014 )
论文原址:https://arxiv.org/pdf/1409.4842.pdf 代码连接:https://github.com/titu1994/Inception-v4(包含v1,v2,v4) ...