try{ //可能会致使错误的代码 }catch(error){ //在错误发生时怎么处理 }
发生错误时能够显示浏览器给出的信息javascript
try{ window.someNonexistentFunction(); }catch(error){ alert(error.message); }
在try-catch语句中是可选的,但finally子句一经使用,代码不管如何都会执行,try语句块中的代码所有正常执行,finally子句会执行,若是由于出错而执行了catch语句块,finally子句照样还会执行。只要代码中包含finally子句,不管try或catch语句块中包含什么代码,甚至return语句,都不会阻止finally子句的执行java
function testFinally(){ try{ return 2; }catch(error){ return 1; }finally { return 0; } }
ECMA-262定义了7种错误类型数组
EvalError,错误会在使用eval()函数而发生异常时被抛出浏览器
new eval();//抛出EvalError eval=foo;//抛出EvalError
RangeError,在数值超出相应范围时触发服务器
var items1=new Array(-20);//抛出RangeError var items2=new Array(Number.MAX_VALUE);//抛出RangeError
ReferenceError,找不到对象时,抛出这个错误app
var obj=x;//在x并未声明的状况下抛出ReferenceError
SyntaxError,把语法错误的JavaScript传入eval()函数时触发ide
eval("a++b");//抛出SyntaxError
TypeError,在变量中保存着意外的类型,或者访问不存在的方式时触发函数
var o=new 10;//抛出TypeError alert("name" in true);//抛出TypeError Function.prototype.toString.call("name");//抛出TypeError
与try-catch语句相配的还有一个throw操做符,用于随时抛出自定义错误。抛出错误时,必需要给throw操做符指定一个值,这个值是什么类型。没有要求lua
throw 12345; throw "Hello world!"; throw true; throw {name:"JavaScript"};
也能够模拟出相似的浏览器错误url
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 URIError("Uri, is that you?"); throw new ReferenceError("You didn’t cite your references properly.");
抛出错误的时机
//函数会在参数不是数组的状况下失败 function process(values){ value.sort(); for(var i=0,len=values.length;i<len;i++){ if(value[i]>100){ return values[i]; } } return -1; }
以上代码,不一样浏览器给出不一样错误信息
//函数重写 function process(values){ if (!(values instanceof Array)){ throw new Error("process(): Argument must be an array."); } values.sort(); for (var i=0, len=values.length; i < len; i++){ if (values[i] > 100){ return values[i]; } } return -1; }
在事件处理程序中返回false能够阻止浏览器报告错误的默认行为
window.onerror=function(message,url,line){ alert(message); return false; }
通常须要关注三种错误
非致命错误
致命错误
for(var i=0,len=mods.length;i<len;i++){ try{ mods[i].init(); }catch(ex){ logError("nonfatal","Module init failed:"+ex.message) } }
能够经过console对象向JavaScript控制台中写入信息,这个对象具备下列方法
function sum(num1, num2){ console.log("Entering sum(), arguments are " + num1 + "," + num2); console.log("Before calculation"); var result = num1 + num2; console.log("After calculation"); console.log("Exiting sum()"); return result; }
在页面 中开辟一小块区域,用以显示信息,这个区域一般是一个元素,而该元素能够老是出如今页面中,但仅用于调试目的,也能够是一个根据须要动态建立的元素
function log(message){ var console = document.getElementById("debuginfo"); if (console === null){ console = document.createElement("div"); console.id = "debuginfo"; console.style.background = "#dedede"; console.style.border = "1px solid silver"; console.style.padding = "5px"; console.style.width = "400px"; console.style.position = "absolute"; console.style.right = "0px"; console.style.top = "0px"; document.body.appendChild(console); } console.innerHTML += "<p>" + message + "</p>"; }
可使用assert()函数代替某些函数中须要调试的if语句,以便输出错误消息
function assert(condition, message){ if (!condition){ throw new Error(message); } } function divide(num1, num2){ assert(typeof num1 == "number" && typeof num2 == "number", "divide(): Both arguments must be numbers."); return num1 / num2; }