HTML5学习笔记(二十六):JavaScript的错误处理
错误相关的调试和处理在开发中是特别重要的一种技能。
try-catch
我们来看下面的情况:
// noneFunc 这个方法并不存在
window.noneFunc();
// js 报错后终止运行这行代码并不会执行到
console.log("hello");
为了避免不继续执行后续代码的情况,可以对可能抛出错误的代码使用try-catch命令包围。
try {
// noneFunc 这个方法并不存在
window.noneFunc();
} catch (error) {
// 一旦报错将会跳到这里执行
console.log(error.message); // window.noneFunc is not a function
}
// 执行不中断,这句代码会得到执行
console.log("hello");
这里要注意error对象有多个属性,但是message属性是所有浏览器都支持的属性。
finally
在try-catch语句中,finally语句是可选语句,其作用是无论被try-catch包含的代码是否出现错误,都一定会执行finally语句包含的代码,如下:
try {
window.test();
} catch (error) {
console.log(error.message);
} finally {
console.log("finally code");
}
//window.test is not a function
//finally code
我们再看一下下面的代码:
function test1() {
try {
return 0;
} catch (error) {
return 1;
} finally {
return 2;
}
}
console.log(test1()); //
function test2() {
try {
return 0;
} catch (error) {
return 1;
}
}
console.log(test2()); //
function test3() {
try {
// test 方法并不存在
test();
return 0;
} catch (error) {
return 1;
} finally {
return 2;
}
}
console.log(test3()); //
function test4() {
try {
// test 方法并不存在
test();
return 0;
} catch (error) {
return 1;
}
}
console.log(test4()); //
从上面的例子来看,在try-catch中包含的return语句都没有执行返回,只会执行finally里的return语句,再看下面的例子:
function test() {
try {
return 0;
} catch (error) {
return 1;
} finally {
console.log("finally");
}
}
console.log(test()); //
如果finally中没有包含return语句,则先执行finally中的语句之后,在返回try-catch语句中的值,我们再看下面的例子:
function test1() {
var i = 0;
try {
return ++i;
} catch (error) {
return -1;
} finally {
return i;
}
}
console.log(test1()); //
function test2() {
var i = 0;
try {
return i++;
} catch (error) {
return -1;
} finally {
return i;
}
}
console.log(test2()); //
我们发现尽管没有执行try-catch中的return语句,但是try-catch中的return语句仍然是执行了的,可以理解为如果finally中存在return关键字,则try-catch中的return关键字都被移除。
还有一种情况,如下:
function test1() {
var i = 0;
try {
return 0;
} catch (error) {
return 1;
} finally {
if (i != 0) {
return 2;
}
}
}
console.log(test1()); //
function test2() {
var i = 0;
try {
return 0;
} catch (error) {
return 1;
} finally {
if (i == 0) {
return 2;
}
}
}
console.log(test2()); //
我们还发现,如果由于条件判断等原因,导致finally中的return语句没有执行到,还是会返回try-catch中的return语句。
错误处理
在JavaScript中,有7种内置的错误类型:
- Error:其它6个错误类型的基类,也提供给开发人员自己定义新的错误类型。
- EvalError:执行eval()方法时的报错。
- RangeError:数值超出范围是报错,如:new Array(-20)或new Array(Number.MAX_VALUE)。
- ReferenceError:找不到对象时的报错。
- SyntaxError:执行eval()方法语法错误时报错。
- TypeError:类型错误时的报错,如:new 10或"name" in true时。
- URIError:在调用encodeURI和decodeURI时出错的报错。
对浏览器来说,只要try-catch包含的代码抛出错误,则浏览器认为该错误已经被处理了,我们需要自行处理该错误。
抛出错误
抛出错误使用throw关键字,对于抛出的错误类型则没有规定,可以是任意类型,而浏览器对用户抛出的错误处理也和内置的错误一致,如果没有try-catch进行包含的话,浏览器会暂停JS的执行。
我们可以简单的抛出一个错误类型或自定义类型:
throw {msg:"my error"};
throw new Error("our error");
我们可以继承Error类型,实现自己的错误类型:
function MyError(msg, code) {
this.message = msg;
this.code = code;
}
MyError.prototype = new Error();
try {
throw new MyError("my error", 1001);
} catch (error) {
console.log(error.message + ", " + error.code); // my error, 1001
}
当然,建议对catch中的error对象使用instanceof关键字进行类型筛选再来有针对性的处理错误。
error事件
error事件仅支持DOM0级的监听方法,即不能通过addEventListener和removeEventListener方法来注册和移除,同时该方法也不会创建对应的event对象,而是将报错信息直接传递过来。
可以理解error事件为整个页面的try-catch语句,如下:
window.onerror = function (message, url, line) {
console.log("message: " + message + ", url: " + url + ", line: " + line);
// 返回 true 则浏览器不会打印错误信息到 console 控制台,返回 false 则浏览器会打印错误信息
return true;
};
test();
// 无论如何报错后的代码都不会再执行了
console.log("run this code!");
该事件可以用来在应用开发时收集浏览器中没有被try-catch包围的语句抛出的错误,但实际上在发布给用户的程序中,是不应该存在这样的错误,因为error事件一旦抛出就表示JS代码执行停止了。
HTML5学习笔记(二十六):JavaScript的错误处理的更多相关文章
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- Java基础学习笔记二十六 JDBC
什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库,J ...
- HTML5学习笔记(十六):原型、类和继承【JS核心知识点】
理解原型 在JavaScript中,只要声明了一个函数,就会为该函数创建一个名为prototype的属性,该属性指向当前函数的原型对象. 而函数的原型对象有一个constructor属性,该属性指向刚 ...
- PHP学习笔记二十六【类的重载】
<?php //重载: //函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名 Class A{ // public function test1(){ // echo &q ...
- angular学习笔记(二十六)-$http(4)-设置请求超时
本篇主要讲解$http(config)的config中的timeout项: $http({ timeout: number }) 数值,从发出请求开始计算,等待的毫秒数,超过这个数还没有响应,则返回错 ...
- Java学习笔记二十六:Java多态中的引用类型转换
Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...
- 深度学习(二十六)Network In Network学习笔记
深度学习(二十六)Network In Network学习笔记 Network In Network学习笔记 原文地址:http://blog.csdn.net/hjimce/article/deta ...
- Nodejs学习笔记(十六)--- Pomelo介绍&入门
目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...
- Nodejs学习笔记(十六)—Pomelo介绍&入门
前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
随机推荐
- 一种通过MQ使缓存和数据库同步的玩法
其他相关玩法 可以搜索 mysql 和 redis 结合使用
- C#实现多文件上传,写到文件夹中,获取文件信息以及下载文件和删除文件
前台:.js //上传附件 function uploadAttachment() { if ($("#Tipbind").attr('checked')) { var ip = ...
- 用yum下载rpm包(不安装)到制定目录
用yum下载rpm包(不安装)到制定目录用yum下载rpm包 www.pcjsh.com 1.安装yum-downloadonly # yum install yum-downloadonly -y ...
- Swift3 获取当前连接WIFI名称
1.导入库 import SystemConfiguration import SystemConfiguration.CaptiveNetwork 2.方法 /// 获取wifi名称 /// /// ...
- leetcode74:二维矩阵搜索问题
使用递归的方式解决,对于matrix,在左上角x,y,右下角xx,yy组成的区域内搜索target. mx=x和xx的中点,my=y和yy的中点 判断matrix[mx][my],如果它大于targe ...
- java struts2入门学习实例--使用struts进行验证
一.为什么要进行验证? 验证几乎是注册登录的必须前提,验证的主要作用有两点: 1.安全性 2.对用户提供差异化服务. 二.如何验证? ActionSupport类中有一个validate()方法,这是 ...
- LVS基本原理
LVS基本原理 简介 负载调度器.真实服务器群节点一起被称为LVS.LVS负载调度器(有时也称为负载平衡器),接收所服务的所有接入服务集群的请求,并决定集群中的哪个节点应该回复其请求. 1)负载调度器 ...
- Docker(二):Dockerfile使用介绍
上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...
- ef SQL Server 版本不支持数据类型“datetime2”
我遇到这个问题是在用数据库模型的时候.当时我电脑上是sql2008 通过vs2010建立了一个ADO.net数据库模型,之后在项目上线的时候,临时把数据库换成了sql2005,在添加新闻的时候出现了“ ...
- sql的行转列(PIVOT)与列转行(UNPIVOT) webapi 跨域问题 Dapper 链式查询 扩展 T4 代码生成 Demo (抽奖程序)
sql的行转列(PIVOT)与列转行(UNPIVOT) 在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比 ...