错误处理
try - catch 语句
如果 try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行 catch 块。此时,catch 块会接收到一个包含错误信息的对象。这个对象保存着错误消息的 message 属性,以及保存错误类型的 name 属性
try {
window.someNonexistentFunction();
} catch (error){
alert(error.message);
}
-
finally 语句
只要代码中包含 finally 子句,则无论 try 或 catch 语句块中包含什么代码——甚至 return 语句,都不会阻止 finally 子句的执行。如果提供 finally 子句,则 catch 子句就成了可选的(catch 或 finally 有一个即可)。
//返回的是 0 function testFinally(){ try { return 2; } catch (error){ return 1; } finally { return 0; } } -
错误类型
- Error:基类型,其他错误类型都继承自该类型
- EvalError:使用 eval() 函数发生异常时被抛出
- RangeError:在数值超出相应范围时触发
- ReferenceError:在找不到对象的时候发生该错误(object expected),通常在访问不到变量的时候发生这种错误
- SyntaxError:语法错误,当语法错误的 js 字符串传入 eval() 函数时会触发该错误
- TypeError:在变量中保存着意外的类型时,或者在访问不存在的方法时,会导致这种错误
- URIError:在使用 encodeURI() 或 decodeURI() ,而 URI 格式不正确时,就会导致该错误
可以在 try-catch 语句的 catch 语句中使用 instanceof 操作符确定错误的类型
new eval();//抛出 evalError eval = foo;//抛出 evalError var a = new Array(-20);//抛出 RangeError var b = new Array(Number.MAX_VALUE);//抛出 RangeError var obj = x;//在 x 未声明的情况下抛出 ReferenceError eval("a ++ b");//抛出 SyntaxError var o = new 10;//抛出 TypeError alert("name" in true);//抛出 TypeError Function.prototype.toString.call("name");//抛出 TypeError try{ doSomething(); }catch(error){ if(error instanceof TypeError){ //处理类型错误 }else if(error instanceof ReferenceError){ //处理引用错误 }else{ //处理其他类型错误 } }
抛出错误
throw 操作符用于随时抛出自定义错误,在遇到 throw 操作符时,代码会立即停止执行,仅当有 try-catch 语句捕获到被抛出的值时,代码才会继续执行
错误事件
任何没有通过 try-catch 处理的错误都会触发 window 对象的 error 事件。onerror 事件处理程序都不会创建 event 对象,但是可以接收三个参数:错误消息、错误所在的 URL 和行号。可以通过在事件处理程序中返回false,阻止浏览器报告错误的默认行为
window.onerror = function(message, url, line){
alert(message);
return false;
};