反对 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 君的代码 谁的效率最高呢!
(稍后公布答案)!
20125 次点击
所在节点    JavaScript
210 条回复
Tankpt
2015-12-29 12:47:56 +08:00
膜拜楼主
jarlyyn
2015-12-29 12:57:06 +08:00
@mzer0

try catch 然后 return 个 false 你告诉我这是一样的?

if 判断代表的是处理已知的错误, catch 所有错误然后 return false 是什么鬼?有未知错误你的程序还能跑下去你准备以后怎么 debug?

效率?除了开发效率以外的效率有什么意义?

好吧,我服了。
mzer0
2015-12-29 13:06:32 +08:00
@jarlyyn 你是傻逼吗? 你不要因为自己无知, 就觉得有喷别人的资本. 这种 try-catch 的用法是经典用法, 很多书里都有写, 你自己搜一搜资料就知道了. 这种异常属于 NULL 指针异常, 属于可回溯的常见异常, 有很多相关的 debug 技巧, 都很常见.
neo2015
2015-12-29 13:08:22 +08:00
当 foo 传入错误参数时 程序是肯定是报错的! obj.wo 无法索引到时,也同样是报错的

如果是参数错误,那不应用 A 的做法吗?

感觉这个例子就像 输入密码, A 君用 if 判断密码错误呢, B 君是用 try 捕获密码错误
mzer0
2015-12-29 13:09:26 +08:00
@jarlyyn 在讨论这个问题之前, 麻烦你看清楚自己有几斤几两, 配不配讨论这个问题! 如果仅仅是因为自己的开发经验没有对方足, 而看不懂对方使用的一些技巧, 然后喷别人, 那你根本没有在这里讨论的资格. mingge 使用了一个中级技巧, 也就是 NULL 空指针异常的技巧, 非常非常非常多的书里都有记载, 五年以上开发者都会知道.
jarlyyn
2015-12-29 13:09:40 +08:00
@mzer0

写代码这么多年了,什么坑没踩过,还需要你来教?还需要搜资料?

一定是 Null 指针异常?类型不一致怎么算?甚至内存不足怎么算?

哪本书里教过你 catch 所有错误 return 个 false 的?

除了会人身攻击还会什么?
tommyzhang
2015-12-29 13:09:47 +08:00
这个臭傻逼也来 v 站了 ? 赶紧 block
jarlyyn
2015-12-29 13:11:34 +08:00
@mzer0

才 5 年开发经验?

就来 JJYY 了?

写过 JS 么?知道 A 做的是什么么?
mzer0
2015-12-29 13:14:16 +08:00
@jarlyyn 我不想和你讨论这个问题. 没见过这个技巧你就说没见过, 你说这么多有什么意义? 你问我, 内存不足怎么算, 类型不一致怎么算, 你自己查一下不就知道了? 这是一个技巧, 三言两语说不清, 你不知道就说不知道, 你查一下吧.
mzer0
2015-12-29 13:17:32 +08:00
jarlyyn
2015-12-29 13:18:34 +08:00
@mzer0

我需要查? js 好歹我也写了 10 多年了吧,当年还是不是为了做前端而是为了挂 mud 呢。

你写过 JS 么?还技巧。正常写过点 js 的不知道A在干什么?正常点写过 js 的没专门写过几个函数来实现 A 的那串 if?

还查一下,该报错的地方不报错强行 return false,你到底写过多久代码?
jarlyyn
2015-12-29 13:19:55 +08:00
@mzer0

你这个链接有任何价值?

SO的帖子都拿出来做证据哦?你丢个手册页出来还靠谱点。

回到这个问题

写过 js 或者是脚本语言的代码么?知道 A 在干嘛么?
dqh3000
2015-12-29 13:19:56 +08:00
个人角度来看, try catch 没什么不好

说远点,如果有一天 es7 stage3 await 普及, try catch 只能大规模应用
mzer0
2015-12-29 13:20:25 +08:00
@jarlyyn 这是一种技巧, 我只是告诉你有这种技巧的存在, 但是我不想和你争论这种技巧有没有存在的必要.

> I'd use the try/catch block when the normal path through the code should proceed without error unless there are truly some exceptional conditions -- like the server being down, your credentials being expired or incorrect. I wouldn't necessarily use it to handle non-exceptional errors -- say like the current user not being in the correct role. That is, when you can reasonably expect and handle an error that is not an exceptional condition, I think you should do your checks.

In the case that you've described -- setting up and performing a query, a try/catch block is an excellent way to handle it as you normally expect the query to succeed. On the other hand, you'll probably want to check that the contents of result are what you expect with control flow logic rather than just attempting to use data that may not be valid for your purpose.

One thing that you want to look out for is sloppy use of try/catch. Try/catch shouldn't be used to protect yourself from bad programming -- the "I don't know what will happen if I do this so I'm going to wrap it in a try/catch and hope for the best" kind of programming. Typically you'll want to restrict the kinds of exceptions you catch to those that are not related to the code itself (server down, bad credentials, etc.) so that you can find and fix errors that are code related (null pointers, etc.).

> In general, try-catch blocks are great because they will break (move to the catch statement) whenever the exception occurs. If-else blocks rely on you predicting when the error will happen.

Edit: Also, catch blocks won't stop your code from halting when an error is hit.

> That ’ s exactly the advantage, using one try/catch instead of multiple if statements. You will also be able to catch any unanticipated errors.
jarlyyn
2015-12-29 13:22:28 +08:00
@mzer0

技巧值钱么?

好笑。

拼音写变量名还算技巧呢。

更何况, try catch 所有错误然后 return false 和你给的代码有什么关系?

最后,既然你引入了写了几年代码这个问题,请告诉我你写了几年代码。
jarlyyn
2015-12-29 13:24:43 +08:00
@dqh3000

catch 所有错误然后直接 return false 也没什么不好么?
Tink
2015-12-29 13:29:26 +08:00
我也用 B
jarlyyn
2015-12-29 13:52:37 +08:00
所有觉得用 B 没问题的回答我一个问题

如果传入的 foo 是有 getter 函数的类,然后 getter 函数出错了怎么办?

比如

var foo=function(){
Object.defineProperty(this,'wo',{get:function(){return realWOValue(this);}});
};
jarlyyn
2015-12-29 13:54:59 +08:00
@mzer0

再提醒某人回答我做了多久开发的问题。
cfans1993
2015-12-29 14:09:18 +08:00
mingge 让我想起 csdn 的一位铜币专家 赵四老师

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

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

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

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

© 2021 V2EX