执行流程 首先执行try块中的代码 如果抛出异常会由catch去捕获并执行 如果没有发生异常 catch去捕获会被忽略掉 但是不管有没有异常最后都会执行finally
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来进行异常处理。例如:
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()); // 使用本地格式显示当前时间
}*/
//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"