有没有一种方法可以覆盖默认的JS错误消息?

3
我猜我的问题的答案是否定的,但由于我不太了解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
你尝试过使用 try..catch..finally 吗? - guest271314
2
我有所疑虑,除了用你自己的错误消息替换它可能会导致混淆,因为并非所有可迭代对象都是数组。不过你总是可以捕获那些你期望是数组的错误,并抛出一个更合适的 TypeError 消息。 - MinusFour
谢谢 @guest271314,我明白如何处理错误 ;) 我想知道是否有一种方法可以更改生成的错误消息,即如何更改在抛出错误之前发生的事情。至于@MinusFour说这不是一个好主意,我同意:我只是好奇是否可能(而且谁知道,在非常有限的情况下可能是有必要的)。 - machineghost
为什么需要自定义错误消息?实际呈现错误的代码是什么? - guest271314
这是一个关于JS错误可能性的问题,而不是关于特定错误处理情况的问题,因此没有具体的代码。至于为什么,请参见我的问题的最后一句话:我只是想了解是否有一种机制可以暴露出来,允许JS代码控制内部生成的错误消息(即不是我捕获和重新抛出或我生成的错误)。 - machineghost
3个回答

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

0
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

你好,


谢谢,但这并没有真正回答我的问题。正如我所提到的,全局错误处理程序(即window.onerror =)只会处理未捕获的错误,至于已捕获的错误……我不是在问如何捕获错误,而是在问如何更改JS生成的错误消息。 - machineghost
你的问题是:有没有办法在JavaScript中更改错误消息?alert('Error : '+msg+'\nURL: '+url+'\nLine Number: '+linenumber) 更改错误消息。 - Grenville Tryon

0

我很不想自问自答,但我在MDN上找到了这段话,它似乎相当清楚地回答了问题:

全局的Error对象本身不包含任何方法,但是通过原型链继承了一些方法。

由于它只通过原型链获取toStringtoSource这两个方法(都不能控制一个错误生成的消息),所以看起来(除非我错过了一些其他与Error.prototype无关的机制)没有办法实现我所要求的功能。


构造函数本身负责设置错误消息。从技术上讲,更改消息可能只需要将错误的 message 属性写入即可。您可以尝试使用自己的构造函数替换它们,以覆盖消息,但不能保证它们最终不会使用对原始构造函数的引用。这在不同的实现中可能会有所不同。 - MinusFour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接