错误处理
try-catch
try{
//可能出错的代码
asdfjsald
} catch(error){
alert("errrrror");
alert(error.message);
}
finally子句
finally子句一旦使用,其代码无论如何都会执行。
真的是无论如何都会执行,就算之前的try-catch中有return语句。
function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {
return 0;
}
}
只要有finally,try和catch中的return都会被忽略
finally有的话,catch语句可以没有。
错误类型
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
抛出错误
与try-catch相配的还有一个throw操作符。抛出错误时要指出一个值用于抛出自定义错误,这个值是什么类型都可以。
throw 12345;
throw "Hello world!";
throw true;
throw { name: "JavaScript"};
在遇到throw时,代码会立刻停止执行,仅当有try-catch捕获时代码才会继续运行。
throw new Error("Something bad happened.");
抛出错误的时机
浏览器对错误的解释可能很模糊,对于大型的应用,抛出你自己的错误对查找问题的根源很有帮助。
function process(values){
if (!(values instanceof Array)){
throw new Error("process(): Argument must be an array.");
}
values.sort();
}
常见错误类型
类型转换错误
这里第三个参数是可选的,但是像第一个例子这样检测并不合适
function concat(str1, str2, str3){
var result = str1 + str2;
if (str3){ // 不要这样 !!!
result += str3;
}
return result;
}
function concat(str1, str2, str3){
var result = str1 + str2;
if (typeof str3 == "string"){
result += str3;
}
return result;
}
数据类型错误
function reverseSort(values){
//if (values != null)
//if (typeof values.sort == "function")
//if (values){
//上面的检测都不靠谱
if (values instanceof Array){
values.sort();
values.reverse();
}
}
通信错误
URL构建错误
使用一个函数来添加参数
function addQueryStringArg(url, name, value){
if (url.indexOf("?") == -1){
url += "?";
} else {
url += "&";
}
url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
return url;
}
把错误记录到服务器
使用Image对象巧妙的将错误记录
function logError(sev, msg){
var img = new Image();
img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" +
encodeURIComponent(msg);
}