简介JavaScript错误处理机制
作者:看云 发布时间:2024-04-19 10:26:43
1、 try-catch语句
ECMA-262第3版引入了try-catch语句,作为JavaScript中处理异常的一种标准方式。
语法:
try{
// 可能会导致错误的代码
}catch (error){
// 在错误发生时怎么处理
}
也就是说,我们应该把所有可能会抛出错误的代码都放在try语句块中,而把那些用于错误处理代码放在catch块中。
try-catch语句的逻辑是:如果try块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行catch块。此时,catch块会接收到一个包含错误信息的对象。
注意:即使你不想使用这个错误对象,也要给它起个名字。
虽然这个对象在不同浏览器中可能包含不同信息,但是都有一个保存着错误消息的message属性,还有一个保存错误类型的name属性(并不是所有浏览器都有)
try{
}catch (error){
console.log(error.message);
}
在跨浏览器编程时,最好还是只使用message属性。
1.1 finally子句
当使用finally子句时,其代码无论如何都会执行,也就是说,不管是正常执行还是出错了,finally子句都会执行。甚至return语句,也不会阻止finally子句的执行。
看下面的例子:
function test(){
try{
console.log('a');
return 2;
}catch(error){
console.log('b');
}finally{
console.log('c');
}
}
console.log(test());
//结果
a
c
2
从运行结果,我们可以看到,return语句并没有阻止finally子句的执行,而且是在finally子句执行后才会返回return语句的值。
2、错误类型
执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,会抛出相应类型的错误对象。
ECMA-262定义了下列7中错误类型:
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
Error是基类型,其他错误类型都继承自该类型。所有错误类型共享了一组相同的属性。
(1)EvalError类型
EvalError类型的错误会在使用eval()函数而发生异常时抛出。简单的说,如果没有把eval()当成函数调用,就会抛出异常。比如:
new eval() // 抛出EvalError
eval = foo; // 抛出EvalError
注意:在ES5中已经不在出现了。
(2)RangeError类型
RangeError类型的错误会在数值超出相应范围时触发。主要有几种情况,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值。
var item = new Array(-20); // 抛出RangeError异常
(3)ReferenceError类型
在找不到对象的情况下,会发生ReferenceError。通常,在访问不存在的变量时,就会发生这种错误。
var obj = x; // 在x并未声明的情况下抛出ReferenceError
(4)SyntaxError类型
SyntaxError是解析代码时发生的语法错误。
var 1a; // 变量名错误,抛出SyntaxError
(5)TypeError类型
在变量中保存着意外的类型,或在访问不存在的方法时,都会导致这种错误。
var o = new 10; //抛出TypeError
(6)URIError类型
URIError是URI相关函数的参数不正确时抛出的错误,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()这六个函数。
2.2 抛出错误
与try-catch语句相配的还有一个throw操作符,用于随时抛出自定义错误。抛出错误时,必须要给throw操作符指定一个值,这个值可以是任何类型。
throw 1;
throw 'tg';
throw true;
throw {name: 'tg'};
2.3 Error对象
所有抛出的错误都是Error构造函数的实例。Error构造函数接受一个参数,表示错误提示,可以从实例的message属性读到这个参数。
在JavaScript中,Error对象的实例必须有message属性,表示出错时的提示信息。在大多数JavaScript引擎中,Error实例还可能有name和stack属性,分别表示错误的名称和错误的堆栈。
var err = new Error('出错了');
err.message; // "出错了"
2.4 自定义错误
我们还可以创建自定义错误消息,最常用的错误类型是Error、RangeError、ReferenceError和TypeError。
throw new Error('报错了');
throw new RangeError('数组长度错误');
另外,利用原型链还可以通过继承Error来创建自定义错误类型:
function CustomError(message){
this.name = 'CustomError';
this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError('我的错误信息');
3、错误(error)事件
任何没有通过try-catch处理的错误都会触发window对象的error事件。
onerror事件处理程序不会创建event对象,但它接受三个参数:错误消息、错误所在的URL和行号。
window.onerror = function(message, url, line){
};
当你在事件处理程序中返回false,可以阻止浏览器报告错误的默认行为
window.onerror = function(message, url, line){
return false;
};
4、调试技术
4.1 alert方法
在以前,大多数都是在要调试的代码中插入alert()函数,看是否执行到这一步来判断哪里出错,这种方式比较麻烦,因为alert()会阻止后续代码的执行(除非你关闭了alert弹窗),而且调试后还要清理。
4.2 console
随着浏览器的不断改善,现在的浏览器都有JavaScript控制台,我们可以向这些控制台输出消息,比如最常用的console对象,它的常用方法如下:
error(message):将错误消息记录到控制台
info(message):将信息性消息记录到控制台
log(message):将一般消息记录到控制台
warn(message):将警告消息记录到控制台
function test(){
console.log('结果:' + (1 + 2));
}
4.3 throw
使用throw抛出错误。
来源:https://www.kancloud.cn/dennis/tgjavascript/241854


猜你喜欢
- 在某些特殊情况下,我们的 Python 脚本需要调用父目录下的其他模块。例如:在编写 GNE 的测试用例时,有一个脚本 generate_n
- 一个简单的例子:将如下代码另存为.wsc文件,并右键“注册”(卸载时右键“不注册”)。<Component> <regis
- 1. 排名函数与PARTITION BY --所有数据 SELECT * FROM dbo.student AS a INNER JOIN
- wechat_sender 是基于 wxpy 和 tornado 实现的一个可以将你的网站、爬虫、脚本等其他应用中各种消息 (日志、报警、运
- 用keras搭好模型架构之后的下一步,就是执行编译操作。在编译时,经常需要指定三个参数lossoptimizermetrics这三个参数有两
- 之前一篇文章里提到了利用Cython来编译Python,这次来讲一下如何用Cython给Python写扩展库。两种语言混合编程,其中最重要的
- 常有人因为页面的面积问题,想在一个窄小的地方,显示一条条的信息,顺序往上滚动,在经典的BBS里,有一个随机上滚动的JS,好些人用不了,现在蛋
- 在Visual Studio 中使用git——什么是Git(一)如果要使用git进行版本管理,其实使用git命令行工具就完全足够了,图形化工
- 工作中有时候需要对vgg进行定制化处理,比如有些时候需要借助于vgg的层结构,但是需要使用的是2 channels输入,等等需求,这时候可以
- 目录Pyppeteer 是什么Pyppeteer能做什么截图导出PDF公众号链接导出PDF示例Pyppeteer 是什么介绍 Pyppete
- 简介CountMinSketch是一种计数器,用来统计一个元素的计数,它能够以一个非常小的空间统计大量元素的计数,同时保证高的性能及准确性。
- 基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的
- 前言MySQL在2016年仍然保持强劲的数据库流行度增长趋势。越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移
- 时至期末,补习信息安全概论作业。恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查
- 前言滑块拼图验证码的失败难度在于每次图片上缺口位置不一样,需识别图片上拼图的缺口位置,使用python的OpenCV库来识别到环境准备pip
- 项目需要把部分代码移植到 Golang , 之前用 Laravel 封装的写起来很舒服,在 Golang 里只能自动动手实现.一开始想的是使
- WindowsError的错误代码详解0操作成功完成。1功能错误。2系统找不到指定的文件。3系统找不到指定的路径。4系统无法打开文件。5拒绝
- 很多人都已经把 Javascript的用的炉火纯青了,但见到defer未必就知道他是做什么用的;很多人也都遇到过这样的问题,需要直接执行别且
- 本文主要介绍了Python pandas 重命名索引和列名称的实现,分享给大家,具体如下:df=pd.DataFrame(np.arange
- 本文实例讲述了Python wxPython库Core组件BoxSizer用法。分享给大家供大家参考,具体如下:wx.BoxSizer:bo