有没有办法覆盖默认的JS错误消息?

时间:2017-11-02 21:29:24

标签: javascript error-handling

我猜测我的问题的答案是否定的,但由于我对Error.prototype的工作原理不够了解,我认为值得一提:有没有办法改变错误来自Javascript错误的消息?

例如,如果我收到错误:

TypeError: (intermediate value) is not iterable

有没有办法改变一些事情,我得到了:

TypeError: You expected an array but it wasn't an array dummy!

我考虑使用全局错误处理程序然后重新抛出它们,但这只适用于未捕获的错误。是否有Error.prototype方法我可以改变(或任何其他方式)来做到这一点?

一点也不重要,只是好奇。

编辑:只是澄清两点:

1)我理解try / catch的工作原理,但我要问的是,是否有办法控制之前生成的消息抛出/捕获错误(可能是通过覆盖Error.prototype的方法)。

2)回答"没有办法做到这一点,所有JS错误消息的生成都在内部处理,JS代码无法控制它"将是完全合法的(......如果是这样的话)。

3 个答案:

答案 0 :(得分:2)

您必须覆盖TypeError类,而不是其中一种方法。

const overridableMessages = [{
  search: 'TypeError: (intermediate value) is not iterable',
  replace: 'TypeError: You expected an array but it wasn\'t an array dummy!'
}]

class TypeError extends window.TypeError {
  constructor (message) {
    super(message)
    overridableMessages.forEach((overridableMessage) => {
      if (this.message === overridableMessage.search) {
        this.message = overridableMessage.replace
      }
    })
  }
}

window.TypeError = TypeError

答案 1 :(得分:0)

我讨厌回答我自己的问题,但我在MDN上找到了这条线,似乎很清楚地回答了这些问题:

  

全局Error对象不包含自己的方法,但它确实通过原型链继承了一些方法。

由于它通过原型链的唯一方法是toStringtoSource(两者都没有控制错误生成的消息),所以它出现了(除非我错过了一些其他的机制,不是' t Error.prototype - 相关的)没有办法完成我的要求。

答案 2 :(得分:-1)

window.onerror = function(msg, url, linenumber) {alert('Error : '+msg+'\nURL: '+url+'\nLine Number: '+linenumber);return true;}
// general error handler

此外:

try { 
}
catch(err) {
alert(err); // here put your case with your messages.
}
// routine error handler

HIH,