JS try catch 语句 异常捕获机

try catch   语句   异常捕获机制

执行流程   首先执行try块中的代码 若是抛出异常会由catch去捕获并执行  若是没有发生异常  catch去捕获会被忽略掉  可是无论有没有异常最后都会执行finallyide



try {
   throw "test";
} catch (ex) {
    console.log(ex); // test
} finally {
    console.log('finally');
}




try
{
throw new Error(10,"asdasdasd")  //throw抛出   Error偏差  
}
catch (e)
{
console.log(e.message);   //message消息
console.log(e.description)   //description描述
console.log(e.number)        //number数
console.log(e.name)          //name名称
//throw new Error(10,"asdasdasd")
}


在JavaScript可使用try...catch来进行异常处理。例如:
oop



try {
 sfoo.bar();
} catch (e) {
  console.log(e.name + ": " + e.message); //ReferenceError: sfoo is not defined  sfoo未定义
}finally {
    console.log('我始终会执行');
}

    目前咱们可能获得的系统异常主要包含如下6种:

    EvalError: raised when an error occurs executing code in eval()  
    EvalError:当一个错误发生在()执行的代码
    
    RangeError: raised when a numeric variable or parameter is outside of its valid range
    RangeError:当一个数值变量或参数的有效范围以外
    
    ReferenceError: raised when de-referencing an invalid reference
    ReferenceError:当德引用无效的参考
      
    SyntaxError: raised when a syntax error occurs while parsing code in eval()
    SyntaxError:当发生语法错误在()解析代码,而
    
    
    TypeError: raised when a variable or parameter is not a valid type
    TypeError:当一个变量或参数不是一个有效的类型
    
    
    URIError: raised when encodeURI() or decodeURI() are passed invalid parameters   
    当encodeuri urierror提出:()或()的参数是经过decodeuri无效
    
    

上面的六种异常对象都继承自Error对象。他们都支持如下两种构造方法:





/*new Error();
new Error("异常信息");

手工抛出异常的方法以下:*/

/*try {
 throw new Error("Whoops!");
} catch (e) {
 alert(e.name + ": " + e.message);
}*/



如要判断异常信息的类型,可在catch中进行判断:


/*try {
 foo.bar();
} catch (e) {
 if (e instanceof EvalError) {
     alert(e.name + ":" + e.message);
 }
 else if (e instanceof RangeError) {
     alert(e.name + ": " + e.message);
 }
 // etc
}*/





  Error具备下面一些主要属性:

    description: 错误描述 (仅IE可用).  
    fileName: 出错的文件名 (仅Mozilla可用).  
    lineNumber: 出错的行数 (仅Mozilla可用).  
    message: 错误信息 (在IE下同description)  
    name: 错误类型.  
    number: 错误代码 (仅IE可用).  
    stack: 像Java中的Stack Trace同样的错误堆栈信息 (仅Mozilla可用).   

所以为了更好的了解错误信息咱们能够将catch部分改成以下形式


/*try {
 foo.bar();
} catch (e) {
 if (browserType != BROWSER_IE) {                               
     alert("name: " + e.name +
      "message: " + e.message +
      "lineNumber: " + e.lineNumber +
      "fileName: " + e.fileName +
      "stack: " + e.stack);           
 }
 else {                       
     alert("name: " + e.name +        
      "errorNumber: " + (e.number & 0xFFFF ) +
      "message: " + e.message");           
 }
}
*/


JavaScript中的throw命令事实上能够抛出任何对象,而且咱们能够在catch接受到此对象。例如:

/*try {
 throw new Date(); // 抛出当前时间对象
} catch (e) {
 alert(e.toLocaleString()); // 使用本地格式显示当前时间

}*/spa







//try  catch  发生嵌套
/*try {
    try {                              //里面有一个try  catch
        throw new Error("oops");       //抛出一个异常
    }
    finally {
        console.log("finally");        //finally接住
    }                                  //他会跳到最近的catch去处理 跳出外层 在跳出块 block以前  会先执行finally
}
catch (ex) {
    console.error("outer", ex.message);
}
//因此上面的的结果是先执行finally而后执行catch

*/



//这里会先执行内部try 因为里面已经处理外部的catch则被忽略
/*try {
  try {
    throw new Error("oops");
  }
  catch (ex) {
    console.log("inner", ex.message);
  }
  finally {
    console.log("finally");
  }
}
catch (ex) {
  console.log("outer", ex.message);
}*/


//try {
//  try {
//    throw new Error("oops");
//  }
//  catch (ex) {
//    console.log("inner", ex.message);
//    throw ex;
//  }
//  finally {
//    console.log("finally");
//  }
//}
//catch (ex) {
//  console.log("outer", ex.message);
//}
//
//结果
//"inner" "oops"
//"finally"
//"outer" "oops"
code