ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 如何发送控制台消息和错误以提醒?

2019-09-28 21:39:05  阅读:237  来源: 互联网

标签:console-log javascript exception alert


我想将错误传递给警报,以警告用户他们在代码中犯了错误,即使他们没有打开控制台.

    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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有