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

问题描述 投票:0回答:4

我猜我的问题的答案是否定的,但由于我对

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 代码无法控制它”的答案是完全合法的(...如果是这样的话)。

javascript error-handling
4个回答
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

嗨,


0
投票
我不想回答我自己的问题,但我在 MDN 上发现了这一行,它似乎非常清楚地回答了问题:

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

由于它通过原型链的唯一方法是

toString

toSource
(它们都不能控制错误生成的消息),因此它会出现(除非我错过了一些与 
Error.prototype
 无关的其他机制) )没有办法完成我的要求。


0
投票
我也希望找到一种方法来重载默认错误对象的消息,但没有任何运气。尽管很hacky,但我通过在 try 块中嵌套一个 try...catch 块来获得所需的内容,以便自定义错误可以向上传播,但仍包含必要的跟踪详细信息。

它可能不是我们想要的 JavaScript,但它是我们拥有的 JavaScript。

function isValidURL(text) { try { try { new URL(text); return true; } catch (error) { throw new TypeError(`${text} could not be parsed into a valid URL -- make sure it begins with a protocol (like http://)`) } } catch (err) { console.error(err) return false; } }

© www.soinside.com 2019 - 2024. All rights reserved.