在向交付的代码添加新代码时使用“Try Catch”是否会产生安全边际?

时间:2014-10-07 15:04:17

标签: javascript performance integration-testing robustness

这更像是一个概念性问题,但具体来说,我正在编程(当前)为包含大量交付代码的javascript文件(IE供应商支持他们提供的代码,而不是我们的自定义)。

由于交付的代码始终执行至关重要,因此我始终使用try{} catch(e){}封装自定义代码的方法确保即使我的自定义代码失败,也会传递代码会执行吗?

我封装了每一个自定义代码。即使我要使用交付变量,我也会将其分配给自定义var,甚至将一个行分配封装在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 个答案:

答案 0 :(得分:2)

这将捕获运行时错误,但不会在分析时(或"early errors" in ECMAScript terms)捕获语法错误。例如,

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

此处,括号不匹配,因此解析器无法确定try结束和catch开始的位置。 try - catch显然不可能捕获该解析错误,因为错误是造成错误try - {在任何代码实际运行之前{1}}。

解析时早期错误的另一个例子是无效的左手赋值,例如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),这只会是一个问题。不要动态构建您的代码字符串。代码字符串!