Создает ли использование "Try Catch" при добавлении нового кода в поставляемый код запас прочности?

Это скорее концептуальный вопрос, но конкретно, я программирую (в настоящее время) в файл javascript, который содержит огромное количество поставляемого кода (т.е. поставщик поддерживает их поставляемый код, а не наши настройки).

Поскольку важно, чтобы поставляемый код всегда выполнялся, мой метод всегда заключает в себе мой настроенный код с try{} catch(e){} гарантировать, что даже если мой пользовательский код потерпит неудачу, выполненный код будет выполнен?

Я инкапсулирую каждый бит пользовательского кода. Даже если мне нужно использовать поставляемую переменную, я присваиваю ее пользовательской переменной, и даже это однострочное назначение инкапсулируется в try{} catch(e){},

Этот метод работает? Является ли этот метод излишним и / или как его можно улучшить?

Вот что я сейчас делаю:

//delivered code
var global1 = true;
var global2 = true;

//my custom code 
try{
  var custom_global3 = true;
} catch(e){
  console.error(e);
}

//more delivered code
if(global1)
  doSomethingAwesome(global2);

//my custom code 
try{
  makeItLessAwesome(custom_global3);
} catch(e){
  console.error(e);
}

1 ответ

Это отлавливает ошибки времени выполнения, но не синтаксические ошибки во время разбора (или "ранние ошибки" в терминах ECMAScript). Например,

try {
    var foo = 1;
    }             // oops..
} catch(e) {
    // never used
}

Здесь есть несоответствие скобок, поэтому парсер не может понять, где try заканчивается и catch начинается. Очевидно, что это невозможно try-catch может перехватить эту ошибку синтаксического анализа, потому что ошибка вызвана try-catch прежде чем какой-либо код на самом деле выполняется.

Другим примером ранней ошибки разбора является неверное левостороннее назначение, например 4 = 5:

try { 4=5; } catch(e) { /* never used */ }

Возможно, лучший подход (в зависимости от того, как структурирован ваш код) состоит в том, чтобы поместить ваш собственный код в отдельные файлы <script> теги. Синтаксическая ошибка остановит весь файл скрипта (или <script> раздел), но если ваш другой код находится в совершенно другом файле /<script>, это не проблема.

Наконец, действительно ужасным решением было бы поместить весь ваш пользовательский код внутри строк в eval заявления и место тех eval заявления в try-catch блоки:

try {
    eval("4=5;")
} catch(e) {
    console.log(e); // we caught the error... but at what cost??
}

eval это действительно плохо с точки зрения производительности, потому что вы перестали анализировать и запускать совершенно новый сценарий, тогда как обычный код за пределами eval анализируется при первом проходе парсера со всем остальным. Избегайте этого решения, если это вообще возможно. (eval также очень плохо с точки зрения безопасности, но это проблема, только если вы динамически создаете строки кода, например var v = "alert('reallybad')"; eval("var foo = " + v);, Не создавайте динамически строки кода!)

Другие вопросы по тегам