Могу ли я определить пользовательские типы для пользовательских исключений в JavaScript? Если так, как бы я это сделал?
javascript
exception
Манки
источник
источник
Ответы:
Из веб-ссылки :
источник
catch (e) { if (e instanceof TypeError) { … } else { throw e; } }
⦃⦄ илиcatch (e) { switch (e.constructor) { case TypeError: …; break; default: throw e; }
⦃⦄.Вы должны создать пользовательское исключение, которое прототипно наследуется от Error. Например:
Это в основном упрощенная версия того, что было опубликовано выше, с улучшением работы стековых трассировок в Firefox и других браузерах. Это удовлетворяет тем же тестам, которые он отправил:
Использование:
И будет вести себя ожидаемо
источник
Вы можете реализовать свои собственные исключения и их обработку, например, здесь:
Существует другой синтаксис для перехвата типизированного исключения, хотя это не сработает во всех браузерах (например, не в IE):
источник
Да. Вы можете бросить все, что вы хотите: целые числа, строки, объекты, что угодно. Если вы хотите бросить объект, просто создайте новый объект, как если бы вы создали его при других обстоятельствах, а затем бросьте его. У ссылки Mozilla на Javascript есть несколько примеров.
источник
Это позволяет использовать как ..
источник
e instanceof Error
было бы ложным.e instanceof MyError
это будет правдой,else if(e instanceof Error)
утверждение никогда не будет оценено.else if(e instanceof Error)
будет последний улов. Скорее всего, последовал простойelse
(который я не включил). Вроде какdefault:
в операторе switch, но для ошибок.Коротко:
Если вы используете ES6 без транспортеров :
См. Распространение ошибок в Javascript с синтаксисом ES6, чтобы узнать, каков текущий лучший метод
Если вы используете транспортер Babel :
Вариант 1: использовать babel-plugin-transform-builtin-extend
Вариант 2: сделай сам (по мотивам той же библиотеки)
Если вы используете чистый ES5 :
Альтернатива: использовать Classtrophobic framework
Объяснение:
Почему расширение класса Error с помощью ES6 и Babel является проблемой?
Потому что экземпляр CustomError больше не распознается как таковой.
В самом деле, из официальной документации Вавилонского, вы не можете расширить любой встроенные классы JavaScript , такие как
Date
,Array
,DOM
илиError
.Проблема описана здесь:
Как насчет других ответов SO?
Все приведенные ответы решают
instanceof
проблему, но вы теряете обычную ошибкуconsole.log
:Принимая во внимание, что, используя метод, упомянутый выше, вы не только исправляете
instanceof
проблему, но также сохраняете обычную ошибкуconsole.log
:источник
Вот как вы можете создавать собственные ошибки, полностью идентичные
Error
поведению native . Эта техника пока работает только в Chrome и node.js. Я также не рекомендовал бы использовать это, если Вы не понимаете, что это делает.В результате мы получаем
Тогда вы можете использовать это так:
И используйте
NotImplementedError
как выError
:И будет вести себя ожидаемо
Обратите внимание, что это
error.stack
работает абсолютно правильно и не будет включатьNotImplementedError
вызов конструктора (благодаря v8Error.captureStackTrace()
).Заметка. Там некрасиво
eval()
. Единственная причина, по которой он используется - это исправитьerr.constructor.name
. Если вам это не нужно, вы можете все немного упростить.источник
Error.apply(self, arguments)
будет указано не работать . Вместо этого я предлагаю скопировать трассировку стека, которая совместима с разными браузерами.Я часто использую подход с наследованием прототипов. Переопределение
toString()
дает вам преимущество в том, что такие инструменты, как Firebug, будут записывать фактическую информацию, а не[object Object]
в консоль для необработанных исключений.Используйте
instanceof
для определения типа исключения.main.js
Exception.js
DuplicateIdException.js
источник
ES6
С новым классом и расширением ключевых слов теперь стало намного проще:
источник
Используйте оператор throw .
JavaScript не заботится о типе исключения (как это делает Java). JavaScript просто замечает, есть исключение, и когда вы поймаете его, вы можете «посмотреть», что «исключение» «говорит».
Если у вас есть разные типы исключений, которые вы должны выбросить, я бы предложил использовать переменные, которые содержат строку / объект исключения, т.е. сообщение. Там, где это необходимо, используйте «throw myException» и в подвохе сравните пойманное исключение с myException.
источник
Смотрите этот пример в MDN.
Если вам нужно определить несколько ошибок (проверьте код здесь !):
Код в основном копируется из: Каков хороший способ расширить Error в JavaScript?
источник
Альтернатива ответу асселин для использования с классами ES2015
источник
Теперь мы добавляем причину или любые свойства, которые мы хотим, к объекту ошибки и извлекаем его. Делая ошибку более разумной.
источник