JS异常的处理

js中的异常处理语句有两个,一个是try……catch……,一个是throw。
try……catch用于语法错误,错误有name和message两个属性。
throw用于逻辑错误
对于逻辑错误,js是不会抛出异常的,也就是说,用try catch没有用。这种时候,需要自己创建error对象的实例,然后用throw抛出异常。

1、try……catch……的普通使用
    try{
        console.log(b);
        console.log("我不会输出的,不要找了")
    }catch(error){
        console.log(error.name + ":" + error.message )
    }
    console.log("我try catch后面的代码")
// ReferenceError:b is not defined
// 我try catch后面的代码

try……catch……无法捕捉到逻辑错误

try {
    var num=1/0;
    console.log(num);//Infinity
}catch(exception){
    console.log(exception.message);
}

这就需要主动抛出异常(throw)

2、throw

1、先看一下js中的错误类型都有哪些
执行代码期间可能会发生的错误有多种类型。每种错误都有对应的错误类型,而当错误发生时,就 会抛出相应类型的错误对象。js共定义了下列 7 种错误类型:

Error   --- 常规错误
ReferenceError   ---   引用错误(引用了未知变量等)
SyntaxError   ---   语法错误()
TypeError   ---  类型错误(不是一个function等)
RangeError   ---  范围错误(如:Maximum call stack exceeded)
EvalError   ---   eval()函数而发生异常时被抛出
URIError

Error类型是基本的错误类型,其他类型都继承自这个类型。
EvalError 类型的错误会在使用 eval()函数而发生异常时被抛出
TypeError 类型在 JavaScript 中会经常用到,在变量中保存着意外的类型时,或者在访问不存在的 方法时,都会导致这种错误
一般情况,不同的错误,处理方式不一样。可以参考下面的处理方式。不过在实际开发中,很多程序员并没有形成处理错误的习惯。

try { 
  someFunction(); 
} catch (error){ 
  if (error instanceof TypeError){ 
    //处理ૌ类型错误 
  } else if (error instanceof ReferenceError){ 
    //处理引用错误 
  } else { 
      //处理其他的错误 
  }
}

2、抛出

throw e;
//抛出用于自定义的异常
throw 'error';
throw '21';
throw true;
throw new myError(); 

这里的异常类型包括字符串、数字、布尔值和对象,如例子中所示。为了获取有用的信息,以及有条件地捕获异常,其中只有对象类型最为常用。

JS里内置的Error对象方便我们使用,‘throw new Error();’ ,同时提供了6种错误类型便于我们捕获,包括EvalError、RangeError、ReferenceError、SyntaxError、 TypeError、URIError

2.1、抛出js内置错误类型的对象

​ 在大部分的代码执行过程中,都是出现错误的时候,由浏览器(javascript引擎)抛出异常,然后程序或者停止执行,或被try…catch 捕获。

​ 然而有时候我们在检测到一些不合理的情况发生的时候也可以主动抛出错误。

​ 使用 throw 关键字抛出来主动抛出异常。

thow后面就是我们要抛出的异常对象。在以前的时候都是出现错误的时候浏览器抛出异常对象,只是现在是我们自己主动抛出的异常对象。
只要有异常对象抛出,不管是浏览器抛出的,还是代码主动抛出,都会让程序停止执行。如果想让程序继续执行,则有也可以用try…catch来捕获。
每一个错误类型都可以传入一个参数,表示实际的错误信息。
我们可以在适当的时候抛出任何我们想抛出的异常类型。throw new SyntaxError(“语法错误…”);

    /*该函数接收一个数字,返回他的平方。*/
    function foo(num) {
        if(typeof num == "number"){
            return num * num;
        }else{
            throw new TypeError("类型错误,你应该传入一个数字...")
        }
    }
    console.log(foo(33))
    console.log(foo("abc"))

2.2、 抛出自定义类型的错误对象
我们不仅仅可以抛出js内置的错误类型的对象,也可以自定义错误类型,然后抛出自定义错误类型的对象。

​ 如果要自定义错误类型,只需要继承任何一个自定义错误类型都可以。一般直接继承Error即可。

    function MyError(message) {
        this.message = "注意:这是自定义的错误"
        this.name = "自定义错误";
    }
    MyError.prototype = new Error();
    try {
        throw new MyError("注意:这是自定义错误类型")
    }catch (error){
        console.log(error.message)
    }

3、合理使用try{}catch(){}
当 try-catch 语句中发生错误时,浏览器会认为错误已经被处理了,浏览器就不再报告错误了。这也是最简单的一种情况。

​ 使用 try-catch 最适合处理那些我们无法控制的错误。假设你在使用一个大型 JavaScript 库中的 函数,该函数可能会有意无意地抛出一些错误。由于我们不能修改这个库的源代码,所以大可将对该函 数的调用放在 try-catch 语句当中,一有什么错误发生,也好可以恰当地处理它们。

​ 在明明知道自己的代码会发生错误时,再使用 try-catch 语句就不太合适了。例如,如果 传给函数的参数是字符串而非数值,就会造成函数出错,那么就应该先检查参数的类型,然后再决定 如何去做。在这种情况下,不应用使用 try-catch 语句。因为try…catch语句比较是比较好资源的事情

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值