使用 try-catch
ECMA-262 第 3 版引入了 try-catch 语旬,当 try-catch 语句中发生错误时, 浏览器会认为错误已经被处理了 ,因而不会报告错误。对于那些不要求用户懂技术,也不需要用户理解错误的 Web 应用程序,这应该说是个理想的结果。不过try-catch 能够让我们实现自己的错误处理机制。使用 try-catch 最适合处理那些无法控制的错误。假设在使用一个大型 JavaScript 库中的函数,该函 数可能会有意无意地抛出一些错误,由于我们不能修改这个库的源代码,所以大可将对该函数的调用放在try-catch语句当中,万一有什么错误发生,也好恰当地处理它们。 在明明白白地知道自己的代码会发生错误时,再使用try-catch语句就不太合适了。例如,如果传递给函数的参数是字符串而非数值,就会造成函数出错,那么就应该先检查参数的类型,然后再决定如何去做。在这种情况下,不应使用try-catch语句。作为 JavaScript 处理异常的一种标准方式。基本语法如下:
try {
//可能会导致错误的代码
} catch(error) {
//在错误发生时怎么处理
}
用户应把所有可能会抛出错误的代码都放在 try 语句块中,而把那些用于错误处理的代码放在 catch 块中。
try {
a+b;
} catch (error) {
alert ("非法的变量");
}
如果 try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行 catch 块。此时, catch 块会接收到一个包含错误信息的对象。与在其他语言中不同的是,即使不使用这个错误对象,也要给它起个名字。错误对象中包含的实际信息会因浏览器而异,但都有一个保存着错误消息的 message 属性。 ECMA-262 还规定了一个保存错误类型的 name 属性,当前所有浏览器都支持这个属性(Opera 9 之前的版本不支持这个属性〉。因此,在发生错误时,就可以像下面这样实事求是地显示浏览器给出的消息。
//这个例子在向用户显示错误消息时,使用了错误对象的 message和name 属性。
try {
a+b;
} catch (error) {
alert(error.message); //错误信息
alert(error.name); //错误类型
}
使用 finally
finally 子旬在 try-catch 语句中是可选的,但如果 finally 子句已经使用, 则其代码无论如何都会执行。 无论try或 catch 语句块中包含什么代码一一甚至 return 语句,都不会阻止 finally 子句的执行。只要代码中包含 finally 子旬,那么无论try还是 catch 语句块中的 return 语句都将被忽略。 因此,在使用 finally 子句之前,一定要非常清楚想让代码怎么样。看下面这个函数。
//如果提供 finally 子句,则 catch 子句就成了可选的,IE7 及更早版本中有一个bug: 除非有 catch 子句,否则 finally 中的代码永远不会执行。如果考虑兼容 IE 早期版本,应提供一个 catch 子句,哪怕里面什么都不写, IE8 修复 了这个 bug。
function test() {
try{
return 2;
} catch (error) {
return l;
} finally {
return 0;
}
}
这个函数在位 try-catch 语句的每一部分都放了一条 return 语句。表面上看,调用这个函数会返回 2, 因为返回 2 的 return 语句位于try语句块中,而执行该语句又不会出错。可是,由于最后还有一个 finally 子句,结果就会导致该 return 语句被忽略, 也就是说,调用这个函数只能返回 0。 如果把自finally子句去掉,这个函数将返回 2。
使用 throw
与问 try-catch 语句相配的还有一个 throw 操作符,用于随时抛出自定义错误。抛出错误时,必须要给 throw 操作符指定一个值,这个值是什么类型没有要求。 在遇到由 throw 操作符时,代码会立即停止执行。 仅当有 try-catch 语句捕获到被抛出的值时,代码才会继续执行。
//下列代码都是有效的。
throw 1;
throw "hi";
throw true;
throw {name: "js"};
通过使用某种内置错误类型,可以更真实地模拟浏览器错误。每种错误类型的构造函数接收一个参数,即实际的错误消息。
throw new Error ("抛出错误");
throw new SyntaxError("SyntaxError");
throw new TypeError("TypeError");
throw new RangeError("RangeError");
throw new EvalError("EvalError");
throw new URLError("URLError");
throw new ReferenceError("ReferenceError");
function process(values) {
if (!(values instanceof Array)) {
throw new Error("process():参数必须为数组。");
}
values.sort();
for (var i=0, len=values.length; i<len; i++) {
if (values[i] > 100) {
return values[i];
}
}
return -1;
}
错误事件
任何没有通过句 try-catch 处理的错误都会触发 window 对象的 error 事件。这个事件是浏览器最早支持的事件之一IE、 Firefox 和 Chrome 为保持向后兼容,并没有对这个事件作任何修改, Opera 和 Safari 不支持 error 事件。 在任何 Web 浏览器中, onerror 事件处理程序都不会创建 event 对象,但它可以接收 3 个参数:
window.onerror = function(message,url,line){
alert(message); //错误信息
alert(url); //错误地址
alert(line); //错误行号
return false; //在事件处理程序中返回 false,可以阻止浏览器报告错误的默认行为。
}
通过返回 false,这个函数实际上就充当了整个文档中的 try-catch 语旬,可以捕获所有无代码处理的运行时错误。这个事件处理程序是避免浏览器报告错误的最后一道防线,理想情况下,只要可能就不应该使用它。只要能够适当地使用 try-catch 语句,就不会有错误交给浏览器,也就不会触发 error 事件。
使用 try-catch的更多相关文章
- SQLServer如何添加try catch
在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...
- try...catch..finally
try..catch..finally try{ 代码块1 }catch(Exception e){ 代码块2 }finally{ 代码块3 } catch是抓取代码块1中的异常 代码块2是出异常后的 ...
- C++异常处理:try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- POJ 3278 Catch That Cow(bfs)
传送门 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 80273 Accepted: 25 ...
- [c#基础]关于try...catch最常见的笔试题
引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...
- 高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...
高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前 ...
- try catch里面try catch嵌套
try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- java try(){}catch(){}自动资源释放
从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Manag ...
- Java throws Exception、try、catch
throws Exception是方法后面接的 意思是向上级抛出异常 try{}里面的异常会被外面的catch捕捉到 抛出异常是throw new Exception("异常"); ...
随机推荐
- 【Python】CV2的一些基本操作
·导入: import cv2 ·读取图片: img = cv2.imread('路径') 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整 ...
- 【C/C++】最大连续子序列和/动态规划
思路主要是看了晴神的算法笔记,实现是自己重新用vector实现了一下,对付逗号隔开的输入 #include <iostream> #include <string> #incl ...
- 04 - Vue3 UI Framework - 文档页
官网的首页做完了,接下来开始做官网的文档页 返回阅读列表点击 这里 路由设计 先想想我们需要文档页通向哪些地方,这里直接给出我的设计: 所属 子标题 跳转路径 文件名(*.vue) 指南 介绍 /do ...
- Redis慢查询配置和优化
目录 一.介绍 二.参数配置 sql动态配置 配置文件设置 三.sql操作 四.优化 一.介绍 慢查询只记录redis执行时间,并不记录redis服务到客户端之间的网络问题. 超过多少毫秒的才被记录 ...
- centos部署golang环境
目录 一.简介 二.部署 一.简介 Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布.Go 是非常年轻的一门语言,它的主要目标是"兼具 Python 等动态语 ...
- tableau添加参考线
一.将数据窗口切换至分析窗口-点击自定义-参考线 二.出现编辑参考线和参考区间的界面(整个表指的是整个视图,每区指的是如下2018就是一个区,每单元格指的是横轴的最小值) 三.我们分别为每区添加最大值 ...
- 学Java,Java书籍的最佳阅读顺序
疫情以来,好久没出差了,今天出差去趟上海,早上 4 点多就起床了,到机场天都没亮.到登机口离起飞还一小时,趁着等飞机的时间,抓紧码字,把这篇文章收个尾. 今天和大家说说学 Java 的读书路线.路线中 ...
- net start Mysql 启动服务时 ,显示"Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误
一.问题 有时候,输入net start Mysql 启动服务时 mysql>net start Mysql 显示 Mysql服务正在启动 Mysql服务无法启动 服务没有报告任何错误 二.原因 ...
- GraphQL 到底有什么魔力?
时间退回到 2012年的一个下午, 美国加利福尼亚州, facebook 的工程师们发现他们才上架没多久的移动端应用就收到了很多差评, 用户反映app响应慢,耗电严重等,经过分析后发现, 应用在第一次 ...
- [BUUCTF]REVERSE——[WUSTCTF2020]level1
[WUSTCTF2020]level1 附件 步骤: 下载下来的附件有两个,output.txt里是一堆数字 64位ida打开第一个附件,检索字符串,发现了flag字样 双击跟进,ctrl+x交叉引用 ...