(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程序提供错误处理机制.当错误发生时,我们必须做好两件事情:一是将错误信息记录日志,发邮件通知网站维护人员,方便技术人员对错误进行 ...
随机推荐
- MongoDB 分片集群技术
在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...
- Exponent CMS 2.3.9 配置文件写入 Getshell分析
在 install/index.php 的第44行 expString::sanitize($_REQUEST); 跟进sanitize函数 public static function saniti ...
- 第十四节:Lambda、linq、SQL的相爱相杀(3)
一. SQL 开篇 1. where用法 #region 封装EF调用SQL语句查询 public static List<T> ExecuteQuery<T>(string ...
- Blender 快捷键笔记
A Select All/Unselect All shift+A Create Z 切换wireframe和solid mode TAB Start or quit EditMode B Activ ...
- phpstudy 安装Apache SSL证书实现https连接
Windows phpstudy安装ssl证书教程. 工具/原料 phpstudy 集成环境 申请的SSL证书 方法/步骤 首先申请免费的ssl证书,很多地方都可以申请.我是在腾讯云!如图 ...
- Java开发之@PostConstruct和@PreDestroy注解
从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这两个注解被用来修饰一个非静态的 ...
- 深入理解JavaScript,这一篇就够了
前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...
- 【原创】大数据基础之ORC(1)简介
https://orc.apache.org Optimized Row Columnar (ORC) file 行列混合存储 层次结构: file -> stripes -> row g ...
- 【原创】大叔问题定位分享(7)Spark任务中Job进度卡住不动
Spark2.1.1 最近运行spark任务时会发现任务经常运行很久,具体job如下: Job Id ▾ Description Submitted Duration Stages: Succeed ...
- 在 VsCode 中自定义代码补全
前言 之前公司的 Vscode 折腾成功过,如今给自己家装一个忘记怎么定义了,故回忆一下写个博文记录 代码补全顾名思义就是输入一两个字母自动提示相关的联想操作,由于VsCode非常精简所以很多联想没有 ...