在向交付的代码添加新代码时使用“尝试捕获”是否会产生安全裕度
Does using a "Try Catch" when adding new code to delivered code create a safety margin?
这更像是一个概念性问题,但具体来说,我正在(目前(编程到一个包含大量交付代码的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);
(时才是一个问题。不要动态构建代码字符串!
- 如何在Win8Metro应用程序的Javascript代码中捕获自己的C#事件
- 使用异步代码引发/捕获错误的替代方法
- GWT:在Java代码中捕获本地JSNI异常
- 在 GruntJS 中尝试捕获任务
- JS尝试/捕获生成jshint错误
- 硫化破坏了聚合物代码(未捕获的类型错误:未定义不是一个函数)
- 在原型方法中抛出异常,未在外部尝试捕获 (JavaScript) 中捕获
- 不安全的 JavaScript 尝试启动带有 URL 的框架的导航更改 - 如何尝试捕获它
- 尝试捕获JavaScript意外标识符
- 如何在此PHP代码中捕获和追加文本框值到URL
- 检查执行布尔值或使用尝试/捕获 PDO
- Javascript尝试捕获
- 在Google脚本中尝试/捕获HTTP响应的最佳方式
- 在向交付的代码添加新代码时使用“尝试捕获”是否会产生安全裕度
- JScript尝试捕获网络异常
- 编写类似Google analytics的Javascript代码来捕获当前URL并将其发送回服务器
- AmCharts内联代码未捕获的引用错误
- 为什么我得到这个主干木偶代码未捕获的引用错误
- 尝试捕获输入的校验和验证,以检查Javascript中输入的三个部分
- 在类似于JSON的代码中捕获值