Почему в Javascript нет низкоуровневых ошибок (Notice/Warning), как в PHP? Например, код 4 * "str"; или другая некорректная математическая операция должен сгенерировать "Notice: A non-numeric value encountered", а потом уже вернуть NaN. Деление на ноль -> "Notice: Division by zero".
Еще примеры:
Обращение к неинициализированной переменной должно сгенерировать вместо исключения уведомление "Notice: x is not defined" и автоматически инициализировать переменную через let или var.
Метод document.querySelector(), если не будет найден DOM элемент по селектору, должен сгенерировать в консоли "Notice: DOM-element 'selector' not found", а потом уже вернуть null.
Попытка прочитать свойство у null или undefined должно выбросить не исключение TypeError, а предупреждение "Warning: Cannot read property of null" и вернуть null или undefined и т. п.
И это далеко не все случаи.
Можно предусмотреть функцию window.triggerError(), а также встроенные константы E_NOTICE, E_WARNING и E_DEPRECATED, а также E_CONSOLE и E_DOCUMENT, указывающие, куда выводить сообщение: только в консоль или в HTML страницы.
Например: window.triggerError("Caught error in code", E_WARNING, E_DOCUMENT);.
Разумеется, лучшей практикой должно быть программирование на JS так, чтобы не было уведомлений и предупреждений.
JavaScript
Почему в JS нет низкоуровневых ошибок (предупреждений)?
Потому что JS изначально создавался как очень простой скриптовый язык для веб-страниц. Именно из-за своего первичного назначения, он не предлагает стандартных средств отладки, содержит огромнейшее количество магии, и изо всех сил пытается выполнять то что написал программист (даже если программист написал херню).
Основная сложность этого языка (иосновная причина ненависти к нему) - как раз в том, что он не вытирает сопельки дебилам-программистам. Никакой родительской опеки: что написал, то и получаешь.
То есть, JS фактически заставляет программиста сразу думать головой, и САМОСТОЯТЕЛЬНО писать грамотный код (а не после того, как носом ткнут).
Для тех у кого с "думать головой" проблемки, майкрософт (что символично) запилил надстройку - TypeScript, который и добавляет JS ту самую родительскую опеку: там и явная типизация всего и вся; и паранодиальные интерфейсы для объектов; и "компилятор" tsc в роли строгой мамки, ругающей за глупые ошибки.
Добавляешь к TS'у любой линтер (в современные редакторы он уже встроен) с запретом использования any, и радуешься.
Основная сложность этого языка (иосновная причина ненависти к нему) - как раз в том, что он не вытирает сопельки дебилам-программистам. Никакой родительской опеки: что написал, то и получаешь.
То есть, JS фактически заставляет программиста сразу думать головой, и САМОСТОЯТЕЛЬНО писать грамотный код (а не после того, как носом ткнут).
Для тех у кого с "думать головой" проблемки, майкрософт (что символично) запилил надстройку - TypeScript, который и добавляет JS ту самую родительскую опеку: там и явная типизация всего и вся; и паранодиальные интерфейсы для объектов; и "компилятор" tsc в роли строгой мамки, ругающей за глупые ошибки.
Добавляешь к TS'у любой линтер (в современные редакторы он уже встроен) с запретом использования any, и радуешься.
Потому, что у каждого разработчика языка программирования свой взгляд на то, что должно быть в его языке и чего быть не должно.
В PHP достаточно необычная многоуровневая система ранжирования ошибок. Но она, скорее, не помогает, а провоцирует говнокод: очень часто предупреждения всех видов тупо отключают, оставляя информирование только об ошибках.
В PHP достаточно необычная многоуровневая система ранжирования ошибок. Но она, скорее, не помогает, а провоцирует говнокод: очень часто предупреждения всех видов тупо отключают, оставляя информирование только об ошибках.
Ернур Искаков
По идее, языки программирования должны подчиняться каким-то стандартам (IEEE и т. д.). Может быть, система ошибок в JS тоже подчиняется некоему стандарту, а система в PHP - нет.
Ну в теории можно написать универсальную функцию, и добавлять её для проверки всех входных параметров всех функций... какой-нибудь
_tmp_check(args) {
args.forEach( (e, i) => {
if( e !== e ) {
console.log("Notice! argument " + i + " is NaN");
} else if ( typeof e === 'undefined' ) {
console.log("Notice! argument " + i + " is undefined");
}
}
А в конце работы регуляркой убрать все её вызовы из кода.
_tmp_check(args) {
args.forEach( (e, i) => {
if( e !== e ) {
console.log("Notice! argument " + i + " is NaN");
} else if ( typeof e === 'undefined' ) {
console.log("Notice! argument " + i + " is undefined");
}
}
А в конце работы регуляркой убрать все её вызовы из кода.
Есть подключи отладчик к проекту в IDE windwos monitor
Похожие вопросы
- Почему в js масив равен не масиву ?
- Почему jQuery методы популярнее js методов при общении с ДоМ?
- ПОЧЕМУ JS ТАКОЙ НЕПОНЯТНЫЙ???
- Помогите определиться с выбором нового языка (JS(TS) vs Java)
- почему так много js файлов?
- Js фреймворки, что полезного можно для себя найти?
- В чем цель фреймворков js web?
- Почему я не раз слышал что Node.js ошибка природы? Над этим смеялся сам разработчик:)
- [HTML/CSS/JS] Как сохранять изменённые в .js данные оффлайн-сервера локально?
- Проверьте 2 кода ((( пожалуйста и ткните носом на ошибку. В общем 1 код работает частично, а второй вообще не работает. JS
Человеку, обучающемуся на JS, даже не придёт в голову, что каждая переменная должна иметь чётко определённый единственный смысл, а не использоваться по всему коду как левая пятка зачесалась.