Создает ли использование "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);
, Не создавайте динамически строки кода!)