专栏首页Micro_awake webJavaScript(六):错误处理机制

JavaScript(六):错误处理机制

1.Error()构造函数

javascript解析或执行语句时,一旦发生错误,js引擎会将其抛出!

JavaScript原生提供了Error()构造函数,所有抛出的错误都是这个构造函数的实例(即对象)。

1 var err1=new Error('shows error');
2 console.log(err1);
3 console.log(err1.message);

运行结果:

err1是由Error()构造函数产生的一个实例对象;对象中有所有javascript引擎都提供的message属性

当代码运行或解析发生错误时,js引擎会抛出错误,程序中断在错误发生的地方,不再往下执行!

有些js引擎还提供错误对象的namestack属性。但是记住它们不是标准的,不一定每个js引擎均提供!

  • message:错误提示信息
  • name:错误名称(非标准属性)
  • stack:错误的堆栈(非标准属性)
1 var err2=new Error('this is error 2');
2 console.log(err2.message);//this is error 2
3 console.log(err2.name);//Error
4 console.log(err2.stack);//Error: this is error 2   at 7.js:5

运行结果:

2.javascript原生错误构造函数

除了Error(),js还定义了6个更详细的构造函数

  1. SyntaxError():语法错误
  2. ReferenceError():引用错误
  3. RangeError():超出有效范围错误
  4. TypeError():类型错误
  5. URIError():URI错误
  6. EvalError():eval函数没有被正确执行错误。注意:该构造函数在ES5中不再出现,现在有些地方依然保留,只是为了兼容性!
1 var err3=new Error('出错了');
2 var err4=new SyntaxError('语法错误');
3 var err5=new ReferenceError('引用错误');
4 var err6=new RangeError('范围超出错误');
5 var err7=new TypeError('类型错误');
6 var err8=new URIError('URI错误');
7 var err9=new EvalError('eval函数使用错误');
8 console.log(err3,err4,err5,err6,err7,err8,err9);
9 console.log(typeof Error,typeof SyntaxError);//function function

运行结果:

3.自定义错误对象(除javascript中内建的7种构造函数创建错误对象)

 1 function ErrorA(message){
 2     this.message= message || '错误';
 3     this.name='ErrorA';
 4 }
 5 //使ErrorA继承Error
 6 ErrorA.prototype=new Error();
 7 ErrorA.prototype.constructor=ErrorA;
 8 
 9 var err10=new ErrorA('产生了ErrorA错误对象');
10 console.log(err10);

运行结果:

4.throw语句:接收一个表达式作为参数,抛出错误或意外,中断程序执行

常用用法如:throw new Error('此处出错');

1 var a=100;
2 console.log(a);
3 throw new Error('error shows');//程序中断在这里,不会往下执行
4 console.log(1000);//程序执行不到这里

运行结果:

模拟一下console对象的assert方法:即传入的参数不是正确的表达式,就抛出错误

1 console.log('---');
2 function assert(expression,message){
3     if(!expression){
4         throw {name:'Assert function',meaage:message};
5     }
6 }
7 assert(100,'error shows 1');//此时没出错
8 assert(undefined,'error shows 2');//此时出错

运行结果:

使用console.assert():

5.try...catch语句:对错误进行处理;结构有try,一般就要有catch。finnally不必须!

当try中抛出一个错误,程序立马跳转到catch中执行。

如下示例:try中抛出多个错误,但只有第一个错误被捕获!

1 console.log('---');
2 try{
3     throw new TypeError('类型错误');//跳转到catch中进行捕获
4     throw new RangeError('范围超出错误');//不会执行
5 }catch(e){
6         console.log(e);    
7 }finally{
8     console.log('finnally');
9 }

运行结果:

相应的,在catch中还可以嵌套语句(如:try...catch)

 1 console.log('---');
 2 try{
 3     throw new TypeError('类型错误');//跳转到catch中进行捕获
 4     throw new RangeError('范围超出错误');//不会执行
 5 }catch(e){
 6     if(e instanceof RangeError){
 7         console.log(e); 
 8     }else{
 9         //嵌套了try...catch语句
10         try{
11             throw e;
12         }catch(e){
13             if(e instanceof TypeError){
14                 console.log('嵌套');
15                 console.log(e.message);
16             }else{
17                 throw e;//如果还不符合条件,继续抛出,可以继续进行嵌套
18             }
19         }
20     }
21            
22 }finally{
23     console.log('finnally');
24 }

运行结果:

注意:try...catch语句处理不当,容易造成结构化编程原则的破坏谨慎使用!!!

 如果catch中有return,注意执行结果:

 1 console.log('---');
 2 var a=10;
 3 function test(){
 4     try{
 5         throw a;
 6         return a+'1';//+'1'分辨出从哪里返回的值
 7     }catch(e){
 8         return a;//在finally执行之前已经将返回值保存下来了,执行完finnally后,立即返回保存的值
 9     }finally{
10         a+=10;
11     }
12 }
13 console.log(test());//10
14 console.log(a);//20

运行结果:

参考:阮一峰JavaScript标准参考教程

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 说说html 的<!DOCTYPE>声明&标准模式与兼容模式

    我们都知道<!DOCTYPE>声明位于文档的最前面,处于<html>标签之前。 <!DOCTYPE>声明不是html标签,它的作用:告知web浏览界面应该使用哪...

    用户1149564
  • JQuery基础

    学习jQuery的时候,很快过了一遍,发现好多知识点不清晰。看来还是要写出来加深印象,平时多练习! jQuery是一个Javascript函数库,轻量级,“写得...

    用户1149564
  • JavaScript OOP(一)之构造函数与new命令

     面向对象编程:Object Oriented Programming,简称OOP。 典型的oop语言,如hava、c++,存在着类的概念,类就是对象的模板 (...

    用户1149564
  • C#的Process类调用第三方插件实现PDF文件转SWF文件

          在项目开发过程中,有时会需要用到调用第三方程序实现本系统的某一些功能,例如本文中需要使用到的swftools插件,那么如何在程序中使用这个插件,并...

    彭泽0902
  • 支付宝扫码支付和微信扫码支付业务场景及问题记录

    这段时间一直在捣鼓扫码支付的功能,项目中使用了支付宝扫码支付和微信扫码支付。中间遇到了很多坑,由于我们系统是分别支持这两种方式的,并且可以随时切换支付方式,特此...

    小柒2012
  • Swift| 基础语法(五)

    总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、数组和字典、方法的书写调用等内容,考虑到阅读体验分多...

    進无尽
  • 今日作业 -- 用js控制DIV的显示隐藏

    这个题很简单的,就是用一个按钮切换二个菜单的显示和隐藏。比昨晚的查找重复字符串要简单的多。 参与写作业的同学们基本都写的不错,思路也都OK,用原生JS,jQue...

    web前端教室
  • 分布式系统一致性分类,你知道几种?

    为了提升系统的可用性、性能、扩展性,我们可以从两个方面着手, 要去建立多个副本。可以放到不同的物理机、机架、机房、地域。一个副本的失效可以让请求转到其他副本。 ...

    企鹅号小编
  • Linux运维工程师的现在与未来

    Linux运维工程师的现在与未来 目录: 1. IT行业发展 2. Linux运维行业现状 a> Linux哪些行业在运用? b> Linux运维学习起来难吗?...

    小小科
  • Laravel 6.7.0 版本发布,支持不加载关联关系

    Laravel 开发团队本周发布了 v6.7.0 版本,新增了一些新特性,以及对之前版本问题的修复。

    学院君

扫码关注云+社区

领取腾讯云代金券