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