错误与异常

278 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

错误与异常

1、概念

错误,指程序中的非正常运行状态,在其它编程语言中称为“异常”或“错误”。解释器会为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息。

通过使用JavaScript提供的异常处理语句,可以用结构化的方式来捕捉发生的错误,让异常处理代码与核心业务代码实现分离。

错误与异常处理在应用中的重要性是毋庸置疑的。任何有影响力的Web应用都需要一套完善的错误处理机制。


try…catch语句

tr ...catch 语句作为JavaScript中处理异常的一种标准方式。try语句标记一块待尝试的语句,如果该语句出现错误,则通过catch语句进行捕获。基本语法如下所示:

 try {
     //可能会导致错误的代码
 }catch(error){
     //在错误发生时的处理
 }

捕捉块

可以使用捕捉块来处理所有可能在try代码块中产生的异常。

 catch(catchID){
     statements
 }
  • 捕捉块指定了一个标识符(上述语句中的catchID)用来存放抛出语句指定的值。
  • 可以用这个标识符来获取抛出的异常信息。

终结块

终结块包含了在try和catch块完成后、下面接着的语句之前执行的语句。终结块无论是否抛出异常都会执行。 如果抛出了异常,就算没有异常处理,终结块里的语句也会执行。

如下示例代码展示了try…catch的语法:

 // v = 100
 // 用于捕获指定语句块中的错误或异常
 try{
     console.log(v);//调用未定义的变量 -> 报错
 }
 // 用于处理try语句中出现的错误
 catch (e) {
     // e -- 表示try语句中出现错误的信息 ,e不是固定的,用法等同于变量
     console.log(e);
 }
 // 终结块 - catch语句无法处理try语句中的错误或异常时,执行finally 语句中的内容
 finally {
     console.log('此句没错');
 }

2.throw语句

与try..catch语句相配合使用的还有throw操作符,用于随时抛出自定义错误。抛出错误时,必须要给throw操作符指定一个值(这个值是什么类型,没有要求)。

throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。

 function fn(v){
     // 确保形参必须存在
     if (v){
         return v;
     }else{
          /*
          throw 语句 - 人为抛出错误或异常
         * 语法结构 -throw 异常或错误的表达式
             * 表达式允许是任意类型的内容
         * 作用 - 预判断当前使用的变量、函数或对象是否存在。
         */
         throw {name :  '猪猪侠'}
     }
 }
 /*console.log(fn(10))//10
 console.log(fn());//报错*/
 ​
 var result;
 try{
     result = fn();
 }catch(e){
     result = 'unknown';//unknown
     // 因为e是一个对象,所以可以调用e.name 属性
     console.log(e.name)
 }
 console.log(result);

嵌套try…catch语句

可以嵌套一个或多个try…catch语句。如果一个内部的try…catch语句没有捕捉块,将会启动匹配外部的try…catch语句的捕捉块。

 // 嵌套try...catch 语句
 try{
     console.log(v);//调用未定义的变量 -> 报错
 }catch (e) {
     try{
         console.log('第一次报错');
     }catch (e) {
         console.log('第二次报错');
     }
 }

基本错误类型

执行代码期间可能会发生的错误有多种类型,每种错误都有对应的错误类型。当错误发生时,就会抛出对应类型的错误对象。

Error是基本错误类型,其他错误类型都继承自该类型。Error类型的错误很少见,如果有也是浏览器抛出的。这个基本错误类型的主要目的是提供给开发人员抛出自定义错误的。

预定义错误类型

image-20201028145621285