JavaScript: Catch not hit on Uncaught SyntaxError [Chrome]

Может ли кто-нибудь объяснить мне, почему «Uncaught SyntaxError» не обрабатывается с помощью try/catch? Можно ли изящно обработать этот тип ошибки, чтобы остальная часть JS работала?

Например:

try { response.write(;); }
catch(e) { console.log(e); }

Этот код выдает «Uncaught SyntaxError: Unexpected token;» Ошибка браузера [Chrome] вместо того, чтобы перейти к улову и зарегистрировать объект ошибки. Аналогичные результаты вы получите и в Firefox; брошенная ошибка вместо того, чтобы обрабатывать ее с помощью улова.


person Kizmar    schedule 30.06.2011    source источник


Ответы (3)


Синтаксическая ошибка не является исключением времени выполнения. Чтобы ваша программа могла генерировать и перехватывать исключения, она должна иметь возможность запускаться. Для запуска должен быть javascript. Приведенный выше пример не является допустимым javascript. Интерпретатор сдается и печатает ошибку, когда видит первую недопустимую строку, и он даже не доходит до строки «поймать».

person Peter Lyons    schedule 30.06.2011
comment
Чтобы отловить ошибки, возникающие при использовании appendChild с модулем скрипта, я использую временный слушатель window.onerror, который я оборачиваю в промис. - person Stefan; 03.11.2020

Что ж, поскольку это синтаксическое исключение, это означает, что синтаксический анализатор javascript не смог проанализировать ваш код. Поскольку браузер не смог проанализировать ваш код, он не может его выполнить. Он даже не знает о вашем блоке try/catch. Блок try/catch может перехватывать только исключения, возникающие в результате выполнения кода в контексте блока.

person Alex Reitbort    schedule 30.06.2011
comment
Блестяще объяснил. Хотел бы я, чтобы кто-нибудь объяснил мне это, пока я изучал JS. - person Jack Giffin; 21.03.2018

Вы можете использовать обходной путь для этого.

try {
    Function('response.write(;);')
} catch(e) {
    console.log(e);
}

Можно использовать для определения поддержки строки шаблона es6 следующим образом:

var isEs6Template;
try {
    Function('``');
    isEs6Template = true;
} catch(e) {
    isEs6Template = false;
}

console.log('es6 template is', isEs6Template ? 'supported' : 'unsupported');
person coderaiser    schedule 06.02.2015