为什么不建议用 try catch

作者&投稿:侨贫 (若有异议请与网页底部的电邮联系)
为什么不建议用 try catch~

一句话解释:
try catch机制非常好。那些觉得try catch不行的人,是他们自己的水平有问题,无法理解这种机制。并且这群人写代码不遵守规则,喜欢偷懒,这才造成try catch不好的错觉。
详细解释:
1.程序要健壮,必须要设计报错机制。
最古老,也是最常见的,比如:
bool CreateFile( );
//如果创建文件失败就返回false,否则返回true。
这种报错方式,显然不好。因为它没有给出产生错误的具体原因。
2.改进:一个函数或过程,会因为不同的原因产生错误,报错机制必须要把这些错误原因进行区分后,再汇报。
比如:
int CreateFile():
//如果创建成功就返回1.
//如果是因为没有权限,导致失败,返回-1。
//如果是因为文件已经存在,导致失败,返回-2。
//如果是因为创建文件发生超时,导致失败,返回-3。
这样看上去,比【1】要好些,至少指出了比较具体的失败原因,但是,还不够。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:cabbage
链接:http://www.zhihu.com/question/29459586/answer/85859852
来源:知乎


最好问清楚是那种语言。不同语言处理Try Catch的机制不一样,所以也会有不同回答。
比如C++,是不推荐用try catch的,它推荐使用Windows API那种HResult来返回错误情况,原因是try catch会在已有的代码上面增加额外的cost, 这个额外的cost不是说只有throw exception的时候才会有,而是在try catch block里面的每一行代码中都会有,这也是为什么他不建议你使用try catch最主要的原因。在Windows的源代码中,是没有任何try catch的,全部用HResult来处理。
比如C#, try catch是建议使用的,C#设计的时候吸取的C++ try catch的教训,所以直接用Try catch包裹已有代码增加的cost可以忽略不计,但是如果真的在代码运行过程中throw exception了,这个cost还是很大的。所以,在C#代码设计中,throw exception基本上是你认为不会发生这种意外的情况下,否则,如果是常见错误,最好不要throw exception。
比如Java, try catch也是建议使用的,我这个用的不熟,不过看它的说明,即使是throw exception的时候的cost也很小。
总结说来,try catch是否建议使用要看具体语言,最重要衡量的标准就是它对已有的代码性能有多大的影响。但是从它设计的角度就是为了处理一些意料不到的情况,但是因为当初引入的时候各种各样的原因,导致有些语言为了性能,不推荐使用。
BTW, try catch最好不要catch (Exception), 这样会吃掉不该吃的问题,比如C#中的StackOverflowException, OutOfMemoryException, NullReferenceException etc. 该crash的时候就应该让App crash, restart, 这也是保护你service的一个好方法。

不同语言处理Try Catch的机制不一样,所以也会有不同回答。

比如C++,是不推荐用try catch的,它推荐使用Windows API那种HResult来返回错误情况,原因是try catch会在已有的代码上面增加额外的cost, 这个额外的cost不是说只有throw exception的时候才会有,而是在try catch block里面的每一行代码中都会有,这也是为什么他不建议你使用try catch最主要的原因。在Windows的源代码中,是没有任何try catch的,全部用HResult来处理。
比如C#, try catch是建议使用的,C#设计的时候吸取的C++ try catch的教训,所以直接用Try catch包裹已有代码增加的cost可以忽略不计,但是如果真的在代码运行过程中throw exception了,这个cost还是很大的。所以,在C#代码设计中,throw exception基本上是你认为不会发生这种意外的情况下,否则,如果是常见错误,最好不要throw exception。
比如Java, try catch也是建议使用的,我这个用的不熟,不过看它的说明,即使是throw exception的时候的cost也很小。
总结说来,try catch是否建议使用要看具体语言,最重要衡量的标准就是它对已有的代码性能有多大的影响。但是从它设计的角度就是为了处理一些意料不到的情况,但是因为当初引入的时候各种各样的原因,导致有些语言为了性能,不推荐使用。
BTW, try catch最好不要catch (Exception), 这样会吃掉不该吃的问题,比如C#中的StackOverflowException, OutOfMemoryException, NullReferenceException etc. 该crash的时候就应该让App crash, restart, 这也是保护你service的一个好方法。
希望对你有帮助~


天镇县19722892222: 为什么不建议用 try catch -
脂费加利: 首先你要明白try和catch是干嘛的,他们是用来进行异常处理的,try语句包含可能发生异常的代码,catch来捕获异常并处理,后面还有finall语句,一般用来关闭IO流,也就是不论出现什么异常,finally语句都会执行,这是很好的编码习惯. 而IO流中都

天镇县19722892222: asp.net 里据说尽量少用try..,catch -
脂费加利: 答案是:是!一点也不可笑!尽量少用 try...catch 的意思是:不要过多使用 catch,通常应允许异常在调用堆栈中往上传播.如果多写两行代码可以减少一种异常的可能性就多写两行,因为抛出异常的过程是非常浪费系统资源的,多做些判断花费的计算时间远远小于抛出异常所需的时间.记住,不需要用的的时候尽量不要用...

天镇县19722892222: C# try catch -
脂费加利: 这样做,主要是捕捉异常,因为C#中,很多地方都定义了异常,当你的程序出异常了,就直接跳到 catch中, 在catch中,我们可以写一些东西,来输出这些错误,但是一般情况下,为了方便,异常写的都是一样的

天镇县19722892222: try catch
脂费加利: try catch 是用来捕获异常的的 这种异常,是有逻辑错误的,不如说 int n = 2 / 0 就属于算术异常,而这个异常也属于逻辑错误(0是不能作为除数的) 而如果是,你的业务逻辑规定 除数 不能为 1 ,那么 int n = 2 / 1 并不能被主动捕获,需要你提前扔进异常,才能被捕获: int chushu = ……; if(chushu == 1){throws new Exception("除数不能为1"); } 总的来说,try catch 也可以处理你的业务逻辑异常,但前提是你先抛出异常.

天镇县19722892222: 为什么java异常处理 不建议使用嵌套try块?谢谢 能举个例子吗? -
脂费加利: 我想是这样的 try块嵌套 try{ try{ } catch(Exception e1){ } }catch(Exception e2){ } 没有必要啊!可以写成这样的形式啊 try{ }catch(Exception e1){ } catch(Exception e2){ }

天镇县19722892222: 关于try catch语句的问题
脂费加利: 是的,是捕获所有异常.如果代码只是你写的这样,catch块里面没有其他语句,那么毫无意义,删掉你的try..catch以后程序的行为不会有任何变化. 一般来说不建议捕获所有异常,但具体情况具体分析.这样的用法可以是 catch { //此处做一些事...

天镇县19722892222: C#数据库操作时,优先使用using还是try...catch,为什么? -
脂费加利: 如果强调调用dispose使用using 强调异常处理使用try..catch 如果写程序的时候知道错误是什么,就用using+if,不建议使用try catch using 语句确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此 通过将对象放入 try 块中,并在调用 finally 块中的Dispose,可以获得相同的结果

天镇县19722892222: 想问一下try catch 是不是C语言的语法?还是仅在C++之后才引入的机制 -
脂费加利: c++的异常机制,c语言没有 但实际在c++中基本不使用,因为影响编译器生成的代码的效率,使用异常机制的代码编译器很难去进行优化的.

天镇县19722892222: JAVA图形用户界面如何判定输入只能为数字 -
脂费加利: try{Long.parseLong("字符串"); } catch (Exception e) {// 不是数字}不建议使用try catch这样效率会很慢

天镇县19722892222: java的try catch语句问题 -
脂费加利: 肯定不会啦. 说一下try catch 和finally到底怎么回事! try catch 成对出现的,一个try就一定要有catch,被try包裹的代码说明,如果这些代码中只要抛出异常的话,就会停止当前的代码运行,而跳到catch中,对于异常进行处理. 而finally呢,他是...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网