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

2015-12-28 23:25:18 +08:00
 minggeJS
(提醒:我不是来问问题的,我已经有自己答案!)
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 君的代码 谁的效率最高呢!
(稍后公布答案)!
20121 次点击
所在节点    JavaScript
210 条回复
lanbing
2015-12-29 11:14:07 +08:00
我发现和我一样聪明的人真多,上面评论的都是。
SourceMan
2015-12-29 11:16:09 +08:00
看来 V 友还不太认识明哥
我也支持 B
iyangyuan
2015-12-29 11:19:43 +08:00
抛开别的不说,程序怎么可能没有异常处理,谁能保证输入一定是正确的?拿本例来说,如果我重新定义了 toString 方法,不就直接保错了么?再说 A 的可读性很强吗?我怎么觉得还不如 B 容易维护?还有,真想不明白为什么在这种地方追求性能。
justjavac
2015-12-29 11:30:32 +08:00
jarlyyn
2015-12-29 11:35:24 +08:00
这个做法必须是 A 。

准确的说,是 A 和 b 结合。

IF 判断是已知可处理的错误。

try 是未知错误。应该记录日志并报错。
freaks
2015-12-29 11:37:55 +08:00
忍俊不禁
xiaoxuz
2015-12-29 11:40:37 +08:00
明哥带了个眼罩?
Sivan
2015-12-29 11:42:45 +08:00
我想知道明哥今年多大?
napsterwu
2015-12-29 12:00:10 +08:00
https://github.com/drduan/minggeJS
我也就发出来大家看看
qhxin
2015-12-29 12:04:50 +08:00
又想搞个大新闻
int64ago
2015-12-29 12:11:46 +08:00
我真的很想爆粗口,但是 V 站貌似不允许

但是你把 GitHub 玩坏后准备把 V2EX 也玩坏吗?!
saber000
2015-12-29 12:15:11 +08:00
看过一篇文章说 B 的在普通场景下效率高,因为有利于 cpu 分支预测.
cheny95
2015-12-29 12:23:55 +08:00
老实说我从来没用过 Windows ,正因为我反感 Windows 。
为什么我反感,因为我完全有开发 Windows 的能力, Windows 的底层我都了如指掌。
虽说我反感 Windows ,但是 Windows 却在测试界占有大量的用户份额,
之后我有个想法,不如重新开发一个属于自己思想,自己架构的 Windows 。
我给了他一个霸气的名字: MingGeWindows ,
它的名字叫 MingGeWindows , MingGe 就是我的大名,一看到 Windows 名字,
就知道作者是我,知道它是国产的,让别人知道国产 Windows 一样做得很出色,出众。
我是 MingGe ,请支持国产 minggeWindows ,因为我们都是中国人。

https://github.com/drduan/minggeJS/issues/201
printempw
2015-12-29 12:30:22 +08:00
全都是感叹号,你很烦诶。到底多喜欢引人注目啊
powtop
2015-12-29 12:31:55 +08:00
我要把你打飞!
cheny95
2015-12-29 12:35:40 +08:00


怪我太年轻
mzer0
2015-12-29 12:40:17 +08:00
@saber000
@jarlyyn
@SourceMan
@iyangyuan
@will0404
@msg7086
@czheo
@funCoder
@chemzqm

发表一下自己的看法. mingge 其实是正确的. 这个问题在 C++里就有过争论, 也是 C++异常处理的经典案例.

在这个特定的场景之下, 其实 mingge 非常聪明, 因为 obj.wo.ok.arr.push("帅哥"); 这一条语句是一个 push 操作, 如果这一条语句出错, 被 catch 到, 那几乎只有一种可能:

* 某一个对象指向 NULL

如果是这样的话, 程序会抛出一个空指针异常, 在优化良好的情形下, 空指针异常的处理速度极快 / 如果异常处理程序被重定向, 那么记录错误日志也效果也极好. 我举一个例子, 下面有一个链表:

* a1->a2->a3->a4 ... ->aN

如果传入的对象是 a1, 但需要调用的对象是 aN, 如何判断 aN 是一个合法对象? 有两种方法.

1) if(a1 && a1->a2 && a1->a2->a3 ... && ... ) 需要进行 N 次判断
2) try { a1->...->aN } catch()

很明显 2)的做法效率极高......

这个情形是很特定的, 因为抛出的异常刚好是一个 NULL 指针异常.
railgun
2015-12-29 12:40:52 +08:00
楼主假装他是 B
mzer0
2015-12-29 12:42:05 +08:00
虽然我不赞同 mingge 的为人处世, 但这时候要就事论事. 这个例子里 mingge 确实是对的......
xiamx
2015-12-29 12:42:33 +08:00
楼主你开心就好...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/246798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX