JS学习16(错误处理与调试)

错误处理

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值