Как остановить скрипт при появление ошибки Maximum call stack size exceeded?
Здравствуйте.
Написал код, который при вводе в поле маску отображает в нижнем поле пример маски.
Все работает, но если вести символ: { или } вся страница зависает и выводить ошибку:
Maximum call stack size exceeded
Такой вопрос:
Как при возникновение данной ошибки остановить выполнения скрипта и вывести сообщение #js-mask-error?
<input type="text" id="js-mask" > <input type="text" id="js-mask-demo" data-mask="999-999"> <div id="js-mask-error">Не удалось сформировать маску</div> |
<input type="text" id="js-mask" > <input type="text" id="js-mask-demo" data-mask="999-999"> <div id="js-mask-error">Не удалось сформировать маску</div>
let options = { clearMaskOnLostFocus:false }; let input = (event) => { if(demo = document.getElementById('js-mask-demo')){ let error = document.getElementById('js-mask-error'); if(error.classList.contains('active')) error.classList.remove('active'); try{ if(event.target.value.length>0){ Inputmask(event.target.value,options).mask(demo); }else{ if(demo.inputmask) demo.inputmask.remove(); demo.placeholder = event.target.placeholder; } }catch(err){ error.classList.add('active'); } } }; let mask = document.getElementById('js-mask'); if(demo = document.getElementById('js-mask-demo')){ Inputmask(demo.getAttribute('data-mask'),options).mask(demo); mask.oninput = input; } |
let options = { clearMaskOnLostFocus:false }; let input = (event) => { if(demo = document.getElementById('js-mask-demo')){ let error = document.getElementById('js-mask-error'); if(error.classList.contains('active')) error.classList.remove('active'); try{ if(event.target.value.length>0){ Inputmask(event.target.value,options).mask(demo); }else{ if(demo.inputmask) demo.inputmask.remove(); demo.placeholder = event.target.placeholder; } }catch(err){ error.classList.add('active'); } } }; let mask = document.getElementById('js-mask'); if(demo = document.getElementById('js-mask-demo')){ Inputmask(demo.getAttribute('data-mask'),options).mask(demo); mask.oninput = input; }
Дополнительно:
Надо не скрипт останавливать, а разбираться в причинах возникновения ошибки. Как правило, эта ошибка возникает при бесконечной рекурсии.
Это связано с тем что в маске должен быть прописан {1,2}, но если допустить ошибку, например написать: 9{ или 9} возникает бесконечная рекурсия.
Можно ли как то остановить скрипт если началась бесконечная рекурсия?
Примерно так можно это сделать.
// инициализация начального состояния переменных let max_call_mask_count = 100; // макс. глубина рекурсии let current_call_mask_count = 0; // текущая глубина ..... if(event.target.value.length>0 && current_call_mask_count < max_call_mask_count) // тут контролируем максимум, чтобы не уйти глубже { current_call_mask_count++; // перед погружением, переопределим счетчик глубины Inputmask(event.target.value,options).mask(demo); }else{ .... if(demo = document.getElementById('js-mask-demo')){ current_call_mask_count = 1; // первый вызов. Inputmask(demo.getAttribute('data-mask'),options).mask(demo); mask.oninput = input; } |
// инициализация начального состояния переменных let max_call_mask_count = 100; // макс. глубина рекурсии let current_call_mask_count = 0; // текущая глубина ..... if(event.target.value.length>0 && current_call_mask_count < max_call_mask_count) // тут контролируем максимум, чтобы не уйти глубже { current_call_mask_count++; // перед погружением, переопределим счетчик глубины Inputmask(event.target.value,options).mask(demo); }else{ .... if(demo = document.getElementById('js-mask-demo')){ current_call_mask_count = 1; // первый вызов. Inputmask(demo.getAttribute('data-mask'),options).mask(demo); mask.oninput = input; }
Буду пробовать .
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для остановки скрипта при появлении ошибки "Maximum call stack size exceeded" можно воспользоваться следующими способами в зависимости от того, на каком языке программирования вы работаете.
1. **JavaScript**: В JavaScript эта ошибка обычно возникает при бесконечной рекурсии. Для предотвращения этого можно использовать проверку на глубину рекурсии и остановить выполнение функции, если она превышает допустимое значение. Например:
```html
function myFunction(depth) { if (depth > 1000) { throw new Error('Maximum call stack size exceeded'); } // ваш код здесь myFunction(depth + 1); } myFunction(0);
```
2. **PHP**: В PHP также можно предотвратить бесконечную рекурсию, установив ограничение на глубину вызовов функций. Например:
```html
function myFunction($depth) { if ($depth > 1000) { throw new Exception('Maximum call stack size exceeded'); } // ваш код здесь myFunction($depth + 1); } myFunction(0);
```
Установив подобные проверки в свой код, вы сможете избежать ошибки "Maximum call stack size exceeded" и остановить выполнение скрипта вовремя, прежде чем это приведет к серьезным проблемам.