在向交付的代码添加新代码时使用“尝试捕获”是否会产生安全裕度

Does using a "Try Catch" when adding new code to delivered code create a safety margin?

本文关键字:代码 尝试捕获 是否 安全 添加 新代码 交付      更新时间:2023-09-26

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

由于始终执行交付的代码至关重要,因此我始终使用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);
}

这将捕获运行时错误,但不会捕获解析时的语法错误(或 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); (时才是一个问题。不要动态构建代码字符串!