Есть ли способ переопределить сообщения об ошибках JS по умолчанию?

1

Я предполагаю, что ответ на мой вопрос - нет, но поскольку я не знаю достаточно о том, как работает Error.prototype я понял, что стоит спросить: есть ли способ изменить сообщения об ошибках из ошибок в Javascript?

Например, если я получаю сообщение об ошибке:

TypeError: (intermediate value) is not iterable

есть ли способ изменить то, что я вместо этого получаю:

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

Я подумал об использовании глобального обработчика ошибок, а затем их переуплотнения, но это будет работать только для неперехваченных ошибок. Есть ли способ Error.prototype который я могу изменить (или любым другим способом) для этого?

Совсем не важно, просто любопытно.

EDIT: просто для уточнения двух моментов:

1) Я понимаю, как работает try/catch, но я спрашиваю, есть ли способ управлять сообщениями, сгенерированными до того, как ошибка будет выброшена/поймана (предположительно, переписав метод Error.prototype).

2) Ответ "нет, нет никакого способа сделать это, все генерирование сообщений об ошибках JS обрабатывается внутренне, а JS-код не имеет возможности контролировать его", было бы совершенно законным (... если это произошло).

  • 3
    Вы пытались использовать try..catch..finally ?
  • 1
    Я сомневаюсь, что замена этого сообщения об ошибке может привести к путанице, поскольку не все итерируемые массивы являются массивами. Вы всегда можете перехватить те ошибки, где вы ожидаете массив, и бросить свой собственный TypeError с более подходящим сообщением.
Показать ещё 3 комментария
Теги:
error-handling

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

Я ненавижу отвечать на свой вопрос, но я нашел эту строку в MDN, которая, кажется, довольно четко отвечает на вещи:

Глобальный объект Error не содержит собственных методов, однако он наследует некоторые методы через цепочку прототипов.

Поскольку единственные методы, которые он получает через цепочку прототипов, - toString и toSource (ни один из которых не управляет сообщением об ошибке), он появляется (если мне не хватает какого-либо другого механизма, который не является Error.prototype -related), что есть я не мог выполнить то, что я спросил.

  • 0
    Сами конструкторы отвечают за настройку сообщения об ошибках. Технически, хотя изменение сообщения может быть таким же простым, как просто запись в message об ошибке. Вы можете попробовать заменить конструкторы своими собственными, которые могут переопределить сообщение, но нет гарантии, что они в конечном итоге будут использовать то, что они не сохраняют ссылку на исходный конструктор внутри. Это может отличаться в разных реализациях.
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
    Спасибо, но это на самом деле не отвечает на мой вопрос. Как я уже упоминал, глобальный обработчик ошибок (т. window.onerror = ) будет обрабатывать только неперехваченные ошибки, а что касается обнаруженных ошибок ... Я не спрашивал, как перехватывать ошибки, а спрашивал, как изменить ошибку сообщения JS генерирует.
  • 0
    Ваш вопрос был: есть ли способ изменить сообщения об ошибках от ошибок в Javascript? alert ('Error:' + msg + '\ nURL:' + url + '\ nLine Number:' + linenumber) изменяет сообщение об ошибке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню