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的更多相关文章

  1. SQLServer如何添加try catch

    在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...

  2. try...catch..finally

    try..catch..finally try{ 代码块1 }catch(Exception e){ 代码块2 }finally{ 代码块3 } catch是抓取代码块1中的异常 代码块2是出异常后的 ...

  3. C++异常处理:try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...

  4. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  5. [c#基础]关于try...catch最常见的笔试题

    引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...

  6. 高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...

    高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前 ...

  7. try catch里面try catch嵌套

    try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...

  8. 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    本文转载自  java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...

  9. java try(){}catch(){}自动资源释放

    从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Manag ...

  10. Java throws Exception、try、catch

    throws Exception是方法后面接的 意思是向上级抛出异常 try{}里面的异常会被外面的catch捕捉到 抛出异常是throw new Exception("异常"); ...

随机推荐

  1. 『与善仁』Appium基础 — 23、操作滑动的方式

    目录 1.swipe滑动 2.scroll滑动 3.drag拖拽事件 4.滑动方法小结 5.拓展:多次滑动 6.综合练习 在Appium中提供了三种滑动的方式,swipe滑动.scroll滑动.dra ...

  2. win10更新后任务栏卡死 的原因和解决办法

    @ 目录 现象: 原因: 第一步:断网并关闭资讯和兴趣 第二步:卸载更新 第三步:关闭win10自动更新 第四步:永久关闭资讯和兴趣 现象: win10 更新后,开机任务栏卡死,点开始反应,设置页面无 ...

  3. Java高精度基础+开根

    在焦作站的acm网络赛中遇到了一个高精度开根的水题--但是那时候WA了 后面学写java补题还T了orz 所以写一篇文章来记录一下java的大整数类型的基础和开根还有一点心得体会吧 首先给那一题的题面 ...

  4. Mongodb单点部署

    目录 一.依赖和环境 二.部署 三.启动和测试 一.依赖和环境 centos7.2,4核cpu, 8G内存 100G硬盘 版本:3.4.7社区版本 端口:27017 数据目录:/usr/local/m ...

  5. tcp十种状态;关于tcp中time_wait状态(2MSL问题)

    tcp十种状态 注意: 当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送 发送FIN通常是应用层对socket进行关闭的结果 关于tcp中time_wait状态的 ...

  6. 奇怪的现象,打印出来可以见到数据,在右边看不到数据,放到list里在页面上也显示不了数据

  7. libevent源码学习(13):事件主循环event_base_loop

    目录开启事件主循环执行事件主循环校对时间 阻塞/非阻塞处理激活队列中的event事件主循环的退出event_base_loopexitevent_base_loopbreak开启事件主循环       ...

  8. Linux 配置与搭建服务

    vsftpd nfs autofs samba firewalld selinux lvm 的试验过程 vsftpd 服务端 yum -y install vsftpd echo 'anon_root ...

  9. [Elasticsearch] ES 的Mapping 设计在实际场景中应用

    背景 项目中有个需求是需要几个字段作为标签,统计各个标签的文档数量,同时支持分词后的全文检索功能. 原有的mapping设计: curl -XPUT http://ip:9200/meta_es_me ...

  10. 【LeetCode】面试题62. 圆圈中最后剩下的数字 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 约瑟夫环 日期 题目地址:https://leetco ...