V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
minggeJS
V2EX  ›  JavaScript

反对 try{}catch (e){}的进来, B 君已经是全群公敌!

  •  
  •   minggeJS · 2015-12-28 23:25:18 +08:00 · 19611 次点击
    这是一个创建于 3041 天前的主题,其中的信息可能已经有所发展或是发生改变。
    (提醒:我不是来问问题的,我已经有自己答案!)
    A 君和 B 君各自用 JS 做一个简单的需求:

    function test(foo){
    var obj= new foo();

    obj.wo.ok.arr.push("帅哥");

    return obj;


    }

    当 foo 传入错误参数时 程序是肯定是报错的! obj.wo 无法索引到时,也同样是报错的
    现在 A 君和 B 君分别采用不同的方法
    -------------------------------------------------------------
    A 君采用的方法是:

    function test(foo) {
    if (typeof foo == "function") {
    var obj = new foo();
    if (obj.wo && obj.wo.ok && Object.prototype.toString.call(obj.wo.ok.arr) == "[object Array]") {
    obj.wo.ok.arr.push("帅哥");
    return obj;
    }
    }
    return false;
    }
    ----------------------------------------------------------------------------------------
    B 君采用的方法是:
    function test(foo) {
    try{
    var obj = new foo();
    obj.wo.ok.arr.push("帅哥");
    return obj;
    }catch (e){}
    return false;
    }



    结果 B 君成为了全群公敌,及取笑的对象, A 君和 B 君各不相让, A 君更是大骂 B 君:“你百度看看看,你用 TRY 是菜鸟的行为, TRY 效率很差的,应该尽量避免使用 TRY ”。
    B 君一向按自己的原则做事, B 君不相信百度,坚持自己的 TRY 立场,B 君觉得自己的 TRY 用得完全合理,一气之下愤然离群!

    现在问大家:上面两段你觉得 A 君和 B 君的代码 谁的效率最高呢!
    (稍后公布答案)!
    第 1 条附言  ·  2015-12-29 17:45:02 +08:00
    第 2 条附言  ·  2015-12-29 18:10:19 +08:00
    @jarlyyn A 君 B 君代码只是一个演试效果,我并没有说用 try 就不能用 if 了,我从头到尾没这样说

    在实际开发中, B 君可以 TRY 再配合适当 if 进行判断, 而 A 君呢,只能 IF 又再多 if 一句。
    最后 A 君的代码,变得又长又没有效率,而 B 君的代码大不了再多一句 if 。一样是轻巧型代码

    所以到最后 B 君始终是最后胜利者
    第 3 条附言  ·  2015-12-30 18:41:38 +08:00
    retun false 只是为了让演试具有立体效,为何要捉住 retun false 不放!何必呢

    function test(foo) {
    try{
    var obj = new foo();
    obj.wo.ok.arr.push("帅哥");
    return obj;
    }catch (e){
    return "我要 DEBUG :"+e
    }

    }
    210 条回复    2016-01-15 23:45:58 +08:00
    1  2  3  
    PublicID
        201
    PublicID  
       2015-12-30 23:43:33 +08:00
    再翻
    falcon05
        202
    falcon05  
       2015-12-31 00:11:19 +08:00 via iPhone
    明哥已经暴走了,明哥很生气,后果很严重
    minggeJS
        203
    minggeJS  
    OP
       2015-12-31 00:12:16 +08:00
    @jarlyyn 你不会吧,我还以为你的方案,不使用 TRY ,用更高级的 IF 方法,
    你这样还不是一样 B 君方案!

    你最终的目也是为了 DEBUG 而已

    if (e.name=='TypeError' || e.name=='ReferenceError'){ 写来多余吧,

    直接 throw e; 给外面
    XadillaX
        204
    XadillaX  
       2015-12-31 00:13:36 +08:00
    @zhfish 说了他不信 JSPerf 这个 [测试软件] ——你没看错,是 [测试软件] 。
    jarlyyn
        205
    jarlyyn  
       2015-12-31 08:40:08 +08:00 via Android
    @minggeJS

    代码写的太少的人,看到别人写的代码么不知道是什么用的。

    用 if 判断的地方说明是符合函数的约定。

    所以不管是不是用 catch ,都需要进行判断和处理。

    之所以会放在 try 里,只是你强行要放罢了。
    Aidea
        206
    Aidea  
       2015-12-31 15:16:36 +08:00
    虽然我不知道你们在讨论的啥,但我还是一楼一楼的看完了!
    可怜我杨佳一世英名~
    kamushin
        207
    kamushin  
       2015-12-31 15:29:48 +08:00
    不觉得这里需要 catch 异常,直接 crash 就行了。
    kamushin
        208
    kamushin  
       2015-12-31 15:30:22 +08:00
    或者 try catch log raise again
    ryd994
        209
    ryd994  
       2015-12-31 16:04:43 +08:00
    @minggeJS #182 你自己直接滚蛋
    知不知道编译器会翻过来?

    程序里不判断 if , throw catch 的时候还不是要判断。所以 C++里才出现了 nothrow 。 JS 没有,不过是因为性能压力还不到这个程度而已。说到底解释器还是要判断。真要性能,用 C ,用汇编去啊,自己写浏览器去啊,别用 JS 在这里 BB 。
    markocen
        210
    markocen  
       2016-01-15 23:45:58 +08:00
    V8 不会对包含 try...catch...的 function 进行优化, 但是产品中使用 try...catch...是不可避免的, 所以需要将 try...catch...单独提出来,以免 main function 无法被优化:

    function tryCatch(fn, context, catcher){
    try {
    return fn.apply(context, args);
    }
    catch(e) {
    return catcher(e)
    }
    }

    function main(){
    tryCatch(something ...)
    }
    1  2  3  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1136 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:48 · PVG 02:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.