捕获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时的建议指南.
如果您使用像jQuery这样的库来分配所有事件处理程序,您可以使用window.onerror
jQuery事件处理程序代码的组合和包装以及带有错误处理函数的ready函数(请参阅:JavaScript错误跟踪:为什么window.onerror不够用).
window.onerror
:捕获IE中的所有错误(以及Firefox中的大多数错误),但在Safari和Opera中无效.
jQuery事件处理程序:捕获所有浏览器中的jQuery事件错误.
jQuery ready函数:捕获所有浏览器中的初始化错误.
WebKit(Safari,Chrome等)现在似乎支持onerror
.
原帖:据我所知,WebKit/Safari不支持该onerror
事件.这是一个该死的耻辱.
实际上,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 }); });
使用您自己的异常处理程序捕获所有异常并使用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/