当前位置:  开发笔记 > 编程语言 > 正文

JavaScript异常处理

如何解决《JavaScript异常处理》经验,为你挑选了4个好方法。

捕获JavaScript中抛出的所有异常的最佳技术是什么?

显然,最好的技巧是使用try ... catch.但是使用异步回调等等,这可能会变得棘手.

我知道IE和Gecko浏览器支持window.onerror,但Opera和Safari呢?

以下是一些测试用例,我希望有一个中央异常处理解决方案:

// ErrorHandler-Test1
var test = null;
test.arg = 5;
// ErrorHandler-Test2
throw (new Error("Hello"));
// ErrorHandler-Test3
throw "Hello again";
// ErrorHandler-Test4
throw {
    myMessage: "stuff",
    customProperty: 5,
    anArray: [1, 2, 3]
};
// ErrorHandler-Test5
try {
    var test2 = null;
    test2.arg = 5;
} catch(e) {
    ErrorHandler.handleError(e);
}
// ErrorHandler-Test6
try {
    throw (new Error("Goodbye"));
} catch(e) {
    ErrorHandler.handleError(e);
}
// ErrorHandler-Test7
try {
    throw "Goodbye again";
} catch(e) {
    ErrorHandler.handleError(e);
}
// ErrorHandler-Test8
try {
    throw {
        myMessage: "stuff",
        customProperty: 5,
        anArray: [1, 2, 3]
    };
} catch(e) {
    ErrorHandler.handleError(e);
}

如果您想到任何其他测试用例,请提及它们.其中一些案例提到了ErrorHandler.handleError方法.这只是使用try ... catch时的建议指南.



1> Karl..:

如果您使用像jQuery这样的库来分配所有事件处理程序,您可以使用window.onerrorjQuery事件处理程序代码的组合和包装以及带有错误处理函数的ready函数(请参阅:JavaScript错误跟踪:为什么window.onerror不够用).

window.onerror:捕获IE中的所有错误(以及Firefox中的大多数错误),但在Safari和Opera中无效.

jQuery事件处理程序:捕获所有浏览器中的jQuery事件错误.

jQuery ready函数:捕获所有浏览器中的初始化错误.


提供的链接移动:http://blogs.cozi.com/tech/2008/04/javascript-error-tracking-why-windowonerror-is-not-enough.html

2> eyelidlessne..:

WebKit(Safari,Chrome等)现在似乎支持onerror.

原帖:据我所知,WebKit/Safari不支持该onerror事件.这是一个该死的耻辱.


呃,不,不是.在问题中提问:"但是Opera和Safari怎么样?"
也许是@nickf,但是如果是这样,它的措辞非常糟糕,我的解释最糟糕的是可以理解,最多也是最可能的.这是一个非常糟糕的理由让人们对我的答案进行投票,特别是考虑到问题*没有***说明它,其他读者可能会从肯定或否定的声明中受益.
我认为他的意思是"我做什么关于Opera和Safari [没有window.onerror]?"

3> adamfisk..:

实际上,jquery方法并不是那么糟糕.看到:

http://docs.jquery.com/Events/error#fn

和:

$(window).error(function(msg, url, line){
  $.post("js_error_log.php", { msg: msg, url: url, line: line });
});


对于现在发现这一点的人 - jquery实际上建议不要将事件绑定到window.error事件 - 请参阅上面的文档链接.提取:不应将jQuery错误事件处理程序附加到窗口对象.[...]请改用window.onerror.

4> MKatleast3..:

使用您自己的异常处理程序捕获所有异常并使用instanceof.

$("inuput").live({
    click : function (event) {
        try {
            if (somethingGoesWrong) {
                throw new MyException();
            }
        } catch (Exception) {
            new MyExceptionHandler(Exception);
        }

    }
});

function MyExceptionHandler(Exception) {
    if (Exception instanceof TypeError || 
        Exception instanceof ReferenceError || 
        Exception instanceof RangeError ||  
        Exception instanceof SyntaxError ||     
        Exception instanceof URIError ) {
        throw Exception; // native error
     } else {
         // handle exception
     }
}

由于没有try-catch块,MyExcetpionHandler将抛出本机错误.

访问http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有