Как остановить скрипт при появление ошибки Maximum call stack size exceeded?

Ссылка скопирована
14 февраля 2026 1 ответ

Здравствуйте.
Написал код, который при вводе в поле маску отображает в нижнем поле пример маски.
Все работает, но если вести символ: { или } вся страница зависает и выводить ошибку:
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; }

Дополнительно:

Надо не скрипт останавливать, а разбираться в причинах возникновения ошибки. Как правило, эта ошибка возникает при бесконечной рекурсии.

  • Rsa97, Проблема в Inputmask, если не правильно прописать маску, то начинает зависает.
    Это связано с тем что в маске должен быть прописан {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; }

  • alexalexes, Вы считаете количество внешних вызовов Inputmask. А рекурсия, как правило, возникает при внутреннем вызове функцией самой себя. В более сложных случаях при замкнутой цепочке вызовов.
  • Остается написать валидацию, для проверки правильности написание фигурных скобок в поле.
    Буду пробовать .
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Анна SEO Ответ

    Для остановки скрипта при появлении ошибки "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);

    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);

    function myFunction($depth) { if ($depth > 1000) { throw new Exception('Maximum call stack size exceeded'); } // ваш код здесь myFunction($depth + 1); } myFunction(0);

    ```

    Установив подобные проверки в свой код, вы сможете избежать ошибки "Maximum call stack size exceeded" и остановить выполнение скрипта вовремя, прежде чем это приведет к серьезным проблемам.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно