Ответ 1
Вполне возможно бросить все, что угодно, но имейте в виду, что если улов за пределами вашего собственного кода, он может ожидать полный экземпляр Error, а не просто строку.
Так как мы можем бросать что-либо с ключевым словом throw
в Javascript, не можем ли мы просто отправить строку сообщения об ошибке напрямую?
Кто-нибудь знает какие-либо уловки в этом?
Позвольте мне добавить некоторые сведения об этом: очень часто в мире JavaScript люди полагаются на проверку параметров, а не на использование механизма try-catch, поэтому имеет смысл только генерировать фатальные ошибки с помощью throw
. Тем не менее, чтобы уловить некоторые ошибки системы, я должен использовать другой класс для своих собственных ошибок и вместо создания подкласса Error, я думаю, что я должен просто использовать String.
Вполне возможно бросить все, что угодно, но имейте в виду, что если улов за пределами вашего собственного кода, он может ожидать полный экземпляр Error, а не просто строку.
Да, вы можете бросить другие ценности, но это не очень хорошая практика.
Кто-нибудь знает какой-нибудь улов в этом?
Строка не является объектом ошибки и не передает никакой полезной информации об отладке. Devtools полагаться на том, что, например, файла и строки, в которой была создана ошибка, в StackTrace в throw
месте и т.д., которые доступны как свойства Error
объектов.
Всякий раз, когда вы думаете о том, чтобы выбрасывать примитивное строковое значение, вместо этого введите new Error("<the string>")
.
Вы можете создавать ошибки с сообщениями.
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
}
Как уже упоминалось выше, если вы не выбрасываете объект 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
}
}
Хотя вы можете выдавать любые типы данных, которые вам нравятся, это не оптимально при отладке. Объект JS Error
содержит все виды информации об ошибке и сообщении. Принимая во внимание, что строка может содержать только сообщение.
Эта дополнительная информация включает в себя:
Вот, например, трассировка стека из Chrome Devtools: