Выбрасывание строк вместо ошибок

Так как мы можем бросать что-либо с ключевым словом throw в Javascript, не можем ли мы просто отправить строку сообщения об ошибке напрямую?

Кто-нибудь знает какие-либо уловки в этом?

Позвольте мне добавить некоторые сведения об этом: очень часто в мире JavaScript люди полагаются на проверку параметров, а не на использование механизма try-catch, поэтому имеет смысл только генерировать фатальные ошибки с помощью throw. Тем не менее, чтобы уловить некоторые ошибки системы, я должен использовать другой класс для своих собственных ошибок и вместо создания подкласса Error, я думаю, что я должен просто использовать String.

Ответ 1

Вполне возможно бросить все, что угодно, но имейте в виду, что если улов за пределами вашего собственного кода, он может ожидать полный экземпляр Error, а не просто строку.

Ответ 2

Да, вы можете бросить другие ценности, но это не очень хорошая практика.

Кто-нибудь знает какой-нибудь улов в этом?

Строка не является объектом ошибки и не передает никакой полезной информации об отладке. Devtools полагаться на том, что, например, файла и строки, в которой была создана ошибка, в StackTrace в throw месте и т.д., которые доступны как свойства Error объектов.

Всякий раз, когда вы думаете о том, чтобы выбрасывать примитивное строковое значение, вместо этого введите new Error("<the string>").

Ответ 3

Вы можете создавать ошибки с сообщениями.

try {
    throw new Error("This is an error");
} catch (e) {
    alert(e.message); // This is an error
}

Но вы можете на самом деле выкинуть строки:

try {
    throw "This is an error";
} catch (e) {
    alert(e); // This is an error
}

Ответ 4

Как уже упоминалось выше, если вы не выбрасываете объект Error, то у вас должны быть блоки try/catch, чтобы замаскировать эти объекты и обрабатывать их соответствующим образом, или же вы попадете в мир повреждений для отладки.

Однако, когда дело доходит до того, чтобы бросать Ошибки для целей обработки без ошибок, таких как управление потоком программы, это может быть полезным способом использования throw без ошибки.

При использовании бросков для управления потоком программ он может быть неэффективным на любом языке, поскольку время выполнения часто делает много тяжелого подъема, чтобы развернуть информацию о стеке вызовов и сериализовать данные, чтобы они были доступны для пользовательской области. Избегая создания ошибок, вы можете избежать этого удара производительности. Ключ в том, что у вас должен быть обработчик стека вызовов, который знает, как справиться с этой ситуацией. Например, если вы throw {isHardStop: true, stopCode: SOME_CODE} и сконструируете обработчики, чтобы обнаружить это, вы можете сгладить часть своего кода или выбрать более чистый синтаксис.

Ваш обработчик для этого делового случая может быть структурирован следующим образом:

try { ... } catch(thr) {
    if(!thr){
       // Is not Error or Json - Handle accordingly
    } else if(thr.isHardStop){
       // Handle the stop
    } else {
       // Most likely a real error. Handle accordingly
    }
}

Ответ 5

Хотя вы можете выдавать любые типы данных, которые вам нравятся, это не оптимально при отладке. Объект JS Error содержит все виды информации об ошибке и сообщении. Принимая во внимание, что строка может содержать только сообщение.

Эта дополнительная информация включает в себя:

  1. fileName: из какого файла была сгенерирована ошибка
  2. Linenumber: из какой строки была выдана ошибка
  3. stacktrace: из какой функции была вызвана ошибка

Вот, например, трассировка стека из Chrome Devtools:

enter image description here