这更像是一个概念性问题,但具体来说,我正在编程(当前)为包含大量交付代码的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);
}
答案 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
),这只会是一个问题。不要动态构建您的代码字符串。代码字符串!)