(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程序提供错误处理机制.当错误发生时,我们必须做好两件事情:一是将错误信息记录日志,发邮件通知网站维护人员,方便技术人员对错误进行 ...
随机推荐
- CentOS7.2 设置静态ip
先找到配置文件: [root@localhost bin]# cd /etc/sysconfig/network-scripts [root@localhost network-scripts]# l ...
- 第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍
一. 原生态接口 1. 从默认路由开始分析 在WebApiConfig.cs类中的Register方法中,我们可以看到默认路由如下: 分析:请求地址在 controller 前面需要加上 api/,c ...
- bash 特殊变量
脚本参数 $* $@ $N shift 执行一个脚本时可以传递参数, 事实上每个参数都有对应的变量$0~$9 ./start.sh a b c $0 $1 $2 $3 当 ...
- [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.3 一维反应流体力学方程组的数学结构
一维理想反应流体力学方程组是一阶拟线性双曲组.
- EffectiveC++ 第5章 实现
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 5 实现 Implementations 适当提出属于 ...
- docker学习------docker私有仓库的搭建
192.168.138.102:23451.私有仓库的搭建(docker pull registry),拉取最新的镜像 2.查看拉取的仓库镜像(docker images) 3.启用registry镜 ...
- laravel 跨库执行原生 sql 语句
执行原生 sql 返回结果集
- tp5入门
runtime目录里的文件是临时文件,可随时删除 在tp5里,命名空间对应了文件的所在目录,app命名空间通常代表了文件的起始目录为application,而think命名空间则代表了文件的起始目录为 ...
- mac 电脑进入root用户
一.使用命令:sudo su -:命令执行后输入密码
- linux文件系统初始化过程(3)---加载initrd(上)
一.目的 本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd. initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序.在l ...