js中错误处理机制
1.基本知识
1. 错误对象
Error,SyntaxError,RangeError, ReferenceError,TypeError,URIError
上面的都是构造函数;
new 命令可以生成错误实例对象;可以传入描述作为参数,成为实例对象的message属性;
除了message属性,还有两个非标准属性(name, stack)stack是调用栈
var err = new Error("错误实例");
err.message; // "错误实例"
err.name; //"Error"
err.stack;//"Error: 错误实例 at <anonymous>:1:11"
2. throw语句
throw语句,如果不进行捕获(try...catch...),会中断当前script脚本中throw之后的所有代码执行。
<script>
function test(){
console.log('1');
setTimeout(() => console.log('2')); //异步任务,下一轮执行,相当于最后执行
throw new Error("err"); //未捕获,这个script内的后面的代码都不执行
setTimeout(() => console.log('3')); // throw后
console.log('4'); // throw后
};
function a() { console.log('5') }
test();
a(); //throw后
</script>
<script>
function b() { console.log('6') }
b(); // 另一个脚本
</script>
// 运行结果如下:
1
Error: err
6
2
如果在定时器中抛出异常,不会中断定时器之外的代码执行。定时器回调函数相当于自己一个“进程”。
示例: 将上面的未捕获异常放在setTimeout中
<script>
function test(){
console.log('1');
setTimeout(() => console.log('2'));
setTimeout(() => {throw new Error("err")}); //改为异步后,只影响本身
setTimeout(() => console.log('3'));
console.log('4');
};
function a() { console.log('5') }
test();
a();
</script>
<script>
function b() { console.log('6') }
b();
</script>
//运行结果如下
1
4
5
6
2
Uncaught Error: err
3
throw命令可以抛出任何类型的值;抛出什么,则捕获的就是什么!
try{
throw "error"
} catch(err){
console.log(err); //"error"
}
3.try...catch...finally..语句
使用try...catch...语句后,可以捕获错误,防止代码崩溃;
1)js中,程序执行遇到return, throw后,后面的语句不再执行;
try{
throw "this is a error";
console.log("after throw"); // 永远不会执行
} catch(error) {
console.log(error);
}
// 运行结果
"this is a error"
2)浏览器中单独的try代码块中不能使用return;否则报错;而且catch无法捕获
try{
return "this is a error";
} catch {
}
// Uncaught SyntaxError: return not in a function
由上面可以知道,return语句必须用在function中。另外,yield语句也是必须在Generator函数中被调用。
如果想在try/catch/finally代码块中使用return语句,可以在外面包裹一层function。
3)catch语句
如果try代码块中代码本身不抛出异常,也没有手动抛出异常,程序永远不会进入catch代码块。
try {
console.log("throw nothind");
} catch { // 参数可以省略
console.log("永远不会执行"); // try没有抛出错误,不会进入catch;永远不会被打印,
}
如果try代码块中抛出异常,则代码进入catch代码块执行完后,继续原来的代码执行。
try {
throw "error";
} catch { // 参数可以省略
console.log("catch")
}
console.log('after');
// 运行结果如下:
catch
after
4)finally语句
finally语句不论是否抛出异常,都会执行。且try后者catch中的return语句取值会在finally之前取值。
var count = 1;
function test() {
try {
console.log("try");
throw new Error("this is a error");
} catch(err) {
console.log("catch error");
return count;
} finally {
console.log("finally")
count+=1;
}
console.log("after"); //永远不会执行
}
console.log(test());
// 运行结果如下
try
catch error
finally
1 //最后返回1,说明return在finally执行前先执行,但是最后才返回
如果在该代码块有return语句,会覆盖try,catch中的return语句
var count = 1;
function test() {
try {
console.log("try");
throw new Error("this is a error");
} catch(err) {
console.log("catch error");
return count;
} finally {
console.log("finally")
count+=1;
return count;
}
console.log("after"); //永远不会执行,因为前面有return语句
}
console.log(test());
// 运行结果如下
try
catch error
finally
2 //执行的是finally语句中的return语句
如果在该代码块中有return语句,会覆盖catch中的throw语句;
var count = 1;
function test() {
try {
throw new Error("this is a error");
} catch(err) {
console.log("catch error");
throw err; // 不会执行;正常catch中遇到throw/return进入finally,等执行完finally代码块,返回这里抛出异常
} finally {
return count; // return 后不会返回catch代码块;如果没有return,会返回catch模块继续抛出异常,然后被外部的try...catch捕获
}
}
try {
test();
} catch(err) {
console.log("catch test error"); // 不会执行
}
// 运行结果如下:
catch error
1 //返回1
4. finally语句应用
示例: 操作文件时,打开文件写入,不管是否写入成功,都要关闭文件
// 伪代码如下
openFile();
try {
writeFile()
} catch(err) {
console.log("写入失败");
} finally {
closeFile(); // 总要执行
}
2. 实践应用
当使用接口请求服务器数据时,一般都要使用try...catch...方法,预防接口报错,程序崩溃!
js中错误处理机制的更多相关文章
- 别再为了this发愁了------JS中的this机制
别再为了this发愁了------JS中的this机制 题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对 ...
- js中错误处理的相关知识
错误bug是指程序执行过程中,导致程序无法正常执行的情况. 后果:程序会强行中断退出: 错误处理: 即使程序出现错误,也保证程序不异常中断的机制. 一般的使用的代 ...
- 再次讲解js中的回收机制是怎么一回事。
在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这 ...
- 关于js中的回收机制,通俗版
在前面的几篇文章中,我讲解过了js中的回收机制,但是对于当时的我来说,我自己对回收机制的这个概念也有些懵懵懂懂,现在对回收机制有了更深入的理解,所以特此发布此文给于总结,也好加深记忆. 如果你想学习闭 ...
- 次讲解js中的回收机制是怎么一回事。
在前几天的一篇闭包文章中我们简单的介绍了一下闭包,但是并没有深入的讲解,因为闭包涉及的知识点比较多,为了能够更好的理解闭包,今天讲解一下关于js中的回收机制. 在初识闭包一文中我说过js中有回收机制这 ...
- [转] js中的钩子机制(hook)
什么是钩子机制?使用钩子机制有什么好处? 钩子机制也叫hook机制,或者你可以把它理解成一种匹配机制,就是我们在代码中设置一些钩子,然后程序执行时自动去匹配这些钩子:这样做的好处就是提高了程序的执行效 ...
- 别再为了this发愁了:JS中的this机制
题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对象.闭包.原型链继承等等,而这其中就包括颇让人费解的th ...
- JS中的this机制
1.this是啥? 简言之,this是JavaScript语言中定义的众多关键字之一,它的特殊在于它自动定义于每一个函数域内,但是this倒地指引啥东西却让很多人张二摸不着头脑.这里我们留个小悬念,希 ...
- php中错误处理机制
php中,异常处理机制是有限的,无法自动抛出异常,必须手动进行,并且内置异常有限. php把许多异常看作错误,这样就可以把这些异常想错误一样用set_error_handler接管,进而主动抛出异常. ...
随机推荐
- centos7.6编译安装php7.3
刚开始搞环境装过集成,发现不好用,后来自己编译安装一些扩展啊设置的都很容易找到. 以前装过5.6.7.0发现不一样,最近出了7.3是php5速度的三倍,那有必要升级一下列. 由于之前安装过老版本,依赖 ...
- golang字符串常用的系统函数
1.统计字符串的长度,按字节len(str) str := "hello北京" fmt.Println("str len=", len(str)) 2.字符串遍 ...
- MySQL使用中遇到的error
eclipse连接不上数据库 //加载驱动 //oracal.jdbc.drive.Oracle.Driver //com.mysql.jdbc.Driver try { Class.forName( ...
- Solr介绍 入门练习
1.1 Solr是什么 Solr是一个基于全文检索的企业级应用服务器. 全文检索:可以输入一段文字,通过分词检索数据!!(复习) 应用服务器:它是单独的服务. 1.2 Solr能做什么 它就是用于做全 ...
- spring整合quartz框架
spring整合quartz: 网上也有很多教程,好多都是基于配置方式,我们使用当然怎么简单就怎么用,所以这里介绍基于注解方式整合quartz.前提:你需要有一个能运行的web项目. 1.引依赖: & ...
- 基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究
基因组所三代单分子测序PacBio完成技术升级—超长读长助力基因组学研究 2015-09-23 | 作者:所级中心基因组平台 张兵 [关闭] 近日,基因组所所级中心基因组平台三代单分子实时测序PacB ...
- row_number() over()函数基本用法
简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记 ...
- python学习之掷骰子游戏
""" 通过学习的python知识,写一个简单的python小游戏 游戏名字:掷骰子比大小 游戏规则: 1.玩家可以选择玩掷几个骰子游戏(默认3个) 2.玩家可以设置双方 ...
- 报错/Warning: You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored
这个报错在以下情形会出现 第一种 <Switch> <Route exact path="/home/index" component={HomeIndex} / ...
- liunx mkisofs 命令的使用(制作iso)
参考的博客 http://www.cnblogs.com/darkknightzh/p/8564483.html 有很多时候需要在liunx 环境中将文件打成 iso 所有很多时候就会用到这个命令(m ...