我猜我的问题的答案是否定的,但由于我对
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 代码无法控制它”的答案是完全合法的(...如果是这样的话)。
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
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
嗨,
全局Error对象不包含自己的方法,但是,它确实通过原型链继承了一些方法。由于它通过原型链的唯一方法是
toString
和
toSource
(它们都不能控制错误生成的消息),因此它会出现(除非我错过了一些与
Error.prototype
无关的其他机制) )没有办法完成我的要求。
它可能不是我们想要的 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;
}
}