javascript try catch捕获异常
2011年03月26日
try{
//code to run
[break;]
}catch([exception]){
//code to run if an exception occurs and the exception is matched
[break;]
}[finally{
//code that is always executed regardless of exception occurring
}]
例如
try{
window.openMyWindow();
alert("Method complete!");
}catch(exception){
alert("an exception occurred");
}finally{
alert("end fo try...catch test.");
}
运行try...catch语句时,解释程序首先进入try关键词后的代码块。执行 window.openMyWindow();时,会产生错误。这时,解释程序立刻从try子句中退出,然后进入catch子句,跳过剩下的代码(alert("Method complete!");)。在catch中的alert被执行,然后继续执行finally子句中的代码。
与java C#不同,javascript在try...catch语句中只能有一个catch子句。因为javascript是弱类型语言,没办法指明catch子句中异常的特定类型,不管是什么错误类型,都是由同一个catch子句处理。而finally子句不管是否发生异常,都要执行当中的代码。
try...catch的嵌套
在try...catch语句中,如果catch子句中也发生错误,那么就可以使用嵌套的try...catch语句。
try{
eval_r("a++b");
}catch(oException){
alert("An exception occurred");
try{
var aErrors=new Array(100000000000000000000000); //caurse error
aError.push(exception)
}catch(oException2){
alert("Another exception occurred");
}
}finally{
alert("all done");
}
上面例子中,抛出第一个错误后,立刻出现第一个警告框。继续执行第一个catch子句时,由于尝试创建一个超大的数组,出现了另一个错误。于是进入第二个catch子句,并显示警告框,最后进入finally子句,执行完毕。
Error对象
javascript有个Error基类用于抛出。Error对象具有以下特性:
name---表示错误类型的字符串
message---实际的错误信息
Error对象的名称对应于它的类,可以是以下值之一
类 发生原因 EvalError 错误发生在eval_r()函数中 RangeError 数字的值超出了 javascript可表示的范围即超出了Number.MIN_VALEU和Number.MAX_VALUE ReferenceError 使用了非法的引用 SyntaxError 在eval_r()函数调用中发生了语法错误 TypeError 变量的类型不是预期所需的 URIError 在encodeURI()或者decodeURI()函数中发生了错误。 message特性可为用户提供更加有意义的信息,同时可以阻止浏览器直接报告错误:
try{
window.openMyWindow();
alert("Method complete");
}catch(oException){
alert("An exception occurred:"+message.name);
}finally{
alert("End of try...catch test.");
}
判断错误类型
1.使用Error对象的name特性
try{
window.openMyWindow();
alert("Method complete");
}catch(oException){
if(oExceptioin.name=="SyntaxError"){
alert("Syntax Error:"+oException.message);
}else{
alert("An unexpected orror occurred:"+oException.message);
}
}
2.使用instanceof操作符,并使用不同错误的类名:
try{
window.openMyWindow();
alert("Method complete");
}catch(oException){
if(oExceptioin instanceof SyntaxError){
alert("Syntax Error:"+oException.message);
}else{
alert("An unexpected orror occurred:"+oException.message);
}
}
抛出异常 throw
throw语法如下
throw error_object;
error_object可以是字符串、数字、布尔值或者是实际对象
throw "An error occurred";
throw 1234;
throw true;
throw new Object();
也可以抛出一个Error对象。Error对象的构造函数只有一个参数,错误信息。例如
throw new Error("You tried to do something bad");
其他的Error子类也可以:
throw new SyntaxError("I don't like your syntax");
throw new TypeError("What type of variable do you take me for?");
throw new RangeError("Sorry,you just don't have the range.");
throw new EvalError("That doesn't evaluate.");
throw new UEIError("Uri,is that you?");
throw new ReferenceError("you didn't cite your references properly.");
实际地说,正常的执行不能继续时,应该抛出一个异常,例如:
function doAdd(){
if(arguments.lengthError("Two number are required!");
}else{
return a+b;
}
}
结合try...catch捕获异常
try{
var result=doAdd(10);
}catch(oException){
alert(oException.message);
}