-1

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

因为交付的代码始终执行是必不可少的,所以我始终封装我的自定义代码的方法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);
}
4

1 回答 1

2

这将捕获运行时错误,但不会捕获解析时的语法错误(或ECMAScript 术语中的“早期错误”)。例如,

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

这里,有一个括号不匹配,所以解析器无法确定我们的try结束和catch开始位置。在任何代码实际运行之前,try-显然不可能catch捕获该解析错误,因为该错误是格式错误引起的。trycatch

解析时早期错误的另一个示例是无效的左手赋值,例如4 = 5

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

一种可能更好的方法(取决于您的代码的结构)是将您的自定义代码放在单独的文件或<script>标签中。语法错误将阻止整个脚本文件(或<script>部分)运行,但如果您的其他代码位于完全不同的 file/<script>中,那不是问题。

最后,一个真正糟糕的解决方案是将所有自定义代码放在eval语句中的字符串中,然后将这些eval语句放入try-catch块中:

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

eval就性能而言,这真的很糟糕,因为您已经停止解析并运行一个全新的脚本,而 an 之外的普通代码在eval解析器的第一次传递时与其他所有代码一起解析。如果可能,请避免使用此解决方案。(eval在安全性方面也很糟糕,但这只是一个问题,如果你动态构建你的代码字符串,比如var v = "alert('reallybad')"; eval("var foo = " + v);不要动态构建你的代码字符串!

于 2014-10-07T15:22:34.007 回答