javascript – 如何发送控制台消息和错误以提醒?
作者:互联网
我想将错误传递给警报,以警告用户他们在代码中犯了错误,即使他们没有打开控制台.
var doc=(frame.contentWindow.document || obj.contentDocument|| obj.contentWindow);
var head = doc.getElementsByTagName('head')[0];
var scriptElement = doc.createElement('script');
scriptElement.setAttribute('type', 'text/javascript');
scriptElement.text = scripts;
try{
head.appendChild(scriptElement);
}
catch(e){ alert("error:"+e.message +" linenumber:"+e.lineNumber);}
当脚本包含错误时,appendChild会抛出错误.它直接进入控制台,我希望它显示在警报中,因为它适用于孩子,他们可能不会检查控制台. try catch块不会捕获错误.
我用eval(脚本)试了一下.
try{
eval(scripts);} catch(e){ alert("error:"+e.message +" linenumber:"+e.lineNumber);}
这确实有效,但这意味着代码执行了两次,这在某些情况下非常不方便.
我试过猴子修补console.error:
console.log=function(){alert("taking over the log");}
console.error=function(){alert("taking over the log");}
但这只有在我真正使用console.error时才有效.不是在抛出实际错误时.
如果不是console.error,在真正的错误情况下,什么函数将错误发送到控制台?我可以访问并更改它吗?
有任何想法吗?帮助将非常感激.
谢谢Jenita
解决方法:
虽然try … catch将对脚本最初运行的代码起作用,因为Jenita说它不会捕获语法错误,并且它也不会捕获稍后执行的回调函数抛出的错误(在try-catch之后很久)已完成).这意味着传递给setTimeout或addEventListener的任何函数都没有错误.
但是,您可以尝试不同的方法.在窗口上注册一个错误监听器.
window.addEventListener("error", handleError, true);
function handleError(evt) {
if (evt.message) { // Chrome sometimes provides this
alert("error: "+evt.message +" at linenumber: "+evt.lineno+" of file: "+evt.filename);
} else {
alert("error: "+evt.type+" from element: "+(evt.srcElement || evt.target));
}
}
当从回调函数抛出异常时,将调用此方法.但它也会触发一般的DOM错误,例如图像无法加载,您可能对此不感兴趣.
它也应该触发语法错误,但前提是它能够先运行,所以你应该将它放在一个可能包含错别字的单独脚本中! (稍后脚本中的语法错误将阻止同一脚本顶部的有效行运行.)
不幸的是,我从未找到过在Firefox中获取evt的行号的方法. (编辑:逛逛,我想现在可能就在那里.)
我在尝试编写FastJSLogger时发现了这一点,这是一个页面记录器,当浏览器devtools有点慢时我用它.
不顾一切地抓住行号,我started to experiment使用了setTimeout和addEventListener的包装器,它们会在这些调用周围重新引入try-catch.例如:
var realAddEventListener = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function(type,handler,capture,other){
var newHandler = function(evt) {
try {
return handler.apply(this,arguments);
} catch (e) {
alert("error handling "+type+" event:"+e.message +" linenumber:"+e.lineNumber);
}
};
realAddEventListener.call(this,type,newHandler,capture,other);
};
显然,这应该在注册任何事件监听器之前完成,甚至可能在加载jQuery之类的库之前完成,以防止它们在我们能够替换之前获取对真实addEventListener的引用.
标签:console-log,javascript,exception,alert 来源: https://codeday.me/bug/20190928/1829129.html