有独到见解的请回复:异常(Exception)是什么,为什么使用异常,如何恰当的使用异常?

CyberWolf 2003-10-20 11:53:13
在csdn讨论区,有很多精辟的但书上没有的关于基础概念的论述,这些论述比起经典的概念可能有些不全面,失于偏颇,但在实际的应用中往往可操作性极强。希望有对“异常(Exception)是什么,为什么使用异常,如何恰当的使用异常?”有独到见解的朋友能把自己的珍藏见解贡献出来,大家共享,共同促进。





……独乐乐,与人乐乐,孰了?哈哈!
...全文
200 69 打赏 收藏 转发到动态 举报
写回复
用AI写文章
69 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajoo 2003-10-30
  • 打赏
  • 举报
回复
对了,如果锱殊必较于效率的话,我想请问,如果循环100万次,是那100万个if(data==0)昂贵呢?还是一个异常昂贵呢?
(前提是,有的异常monitor已经可以做到对异常没有抛出的时候保持0开销,只付出一些空间开销,而这个空间开销,我认为可以忽略)
ajoo 2003-10-30
  • 打赏
  • 举报
回复
呵呵。我都猜到你会这么说了。:)

我不是说了吗?让你把我当反面典型啊。

我看到这个api,但是我也举出了我的理由认为它不好的一面,异常好的一面啊。我不认为因为这个api做了这个选择,就可以充分地证明这个选择是永远正确的,可以用作指导的。
你可以说服我啊。我自己的看法怎么了?原因,论据我都给出了,不要因人废言,不要因人立言,对不对? 认为我的理由,逻辑有问题,欢迎批驳啊。
仅仅用某某人,某某书这么说的,某个api这么做的,对我说服力不够啊。


8-2法则就是说,对那80%,可读性,维护性比效率重要。对么?
然后我也给出了为什么它属于80%那里面,也给出了为什么它影响可读性,可维护性。

对这个推理有意见,给出反驳就行了啊。
truezerg 2003-10-30
  • 打赏
  • 举报
回复
括号里的前提不具有普遍性,我们讨论问题当然要讨论目前的情况,和普遍的情况。或许将来java发展了,对异常的处理的代价可以缩减到很少,那种情况下就要对问题重新审视,什么都是相对的。 所以讨论问题的大提前都应该以"目前"的"普遍"的情况出发才是。不然讨论什么样的问题都会变的没有意义。

ajoo兄,我们的性格难道很像?

我想我们没有必要在浪费更多的时间在这个贴子上无休止的争论下去。我的时间不多,我想你也一样很忙。

我们也没有必要谁把谁驳倒才肯罢休。你也说了你的观点,我也说了我的观点。或许别人还有他自己的观点。看这我们讨论的朋友,我想他自己中心也有自己的想法。大家对这个问题可以权衡一下,自己做出选择。
ajoo 2003-10-30
  • 打赏
  • 举报
回复
呵呵。就是。抛弃没必要的争论。我想我们可以关注一下比较容易分辨的一个问题:
是否异常monitor已经可以做到在异常没有抛出的时候保持0开销?
我所接受到的信息是肯定的,看来你得到的答案是否定的?

可惜,我在这方面没有第一手的信息,都是从和别人的讨论中得到的(据说c++的异常monitor就是0开销。)
ajoo 2003-10-29
  • 打赏
  • 举报
回复
呵呵,你要是循环一万次,还抛一万个异常呢。你不会象新闻记者一样,给我来个断章取义,说:ajoo说抛一万个异常没有效率问题把?

你怎么不看你循环体内部的东西比抛一个异常昂贵多了呢?

还是那句话,优化要看主要矛盾。
truezerg 2003-10-29
  • 打赏
  • 举报
回复
那你不认为抛一百个异常是坏处吗? 对比一下二种的好与坏,你选择就是抛异常了?
ajoo 2003-10-29
  • 打赏
  • 举报
回复
好处在于不需要占用这个0的返回值,还有其它的好处,我不都列出来了么?
truezerg 2003-10-29
  • 打赏
  • 举报
回复
那为什么非要浪费那本来不该浪费的时间和空间呢?

而且读一百个文件抛出一百个异常我没看来程序好在哪里啊。
ajoo 2003-10-29
  • 打赏
  • 举报
回复
比例,比例。优化程序要看瓶颈。一个小函数中某段代码占1%,那么不管这个函数被调用多少次,那段代码仍然占1%。
truezerg 2003-10-29
  • 打赏
  • 举报
回复
不是我最后的贴子说出了关键。我一直都是这个意思。只是我第一次发现我的表达能力差到这份上
truezerg 2003-10-29
  • 打赏
  • 举报
回复
是啊。可以这样写啊。 但是我读一百个文件正常的情况下就产生了一百个异常。这是主要的我认为不合适的地方啊。
ajoo 2003-10-29
  • 打赏
  • 举报
回复
就是。你这个最后的贴子说出了关键。
我就认为这里面应该慎重。除非有特别的效率考虑应该用异常。


对了,一百个文件是个循环,每个文件不是还有个小循环?


foreach file
try{
foreach data in file
......
}
catch(NoSuchDataException e){
}
不是一样可以?

truezerg 2003-10-29
  • 打赏
  • 举报
回复
便有些情况我们是无法用hasNext()这种方法预先判断来避免错误的。这就有一个到底是在出错时产生异常还是返回错误码的选择。我还是认为在没有意外的情况下可以预见这个事情一定会发生的时候用错误码返回,而不用异常
truezerg 2003-10-29
  • 打赏
  • 举报
回复
zerg: 错误码的用意就是为了让“一定发生的事情”“不应该发生”。
我说错了。 这里不是错误码的用意。我想说的就是例如hasNext()的这种用法的用意。
truezerg 2003-10-29
  • 打赏
  • 举报
回复
不是每一个文件一个循环,我的意思是我要循环读一百个文件。
ajoo 2003-10-29
  • 打赏
  • 举报
回复
你混淆了异常和错误的概念。

错误:程序逻辑或者外界条件不符合预期
异常:在发生错误时的一种处理手段
错误码:在发生错误时的一种处理手段

hasNext()在任何时候调用都是合法的,所以,不会产生错误
next()在hasNext()非假的时候是不合法的,所以,无论抛出异常还是返回特殊值,都是已经产生了错误

isClosed()不管connection是开着还是关着,调用都是合法的
createStatement()在connection关着的时候调用是非法的,无论抛出异常还是返回特殊值,都是已经产生了错误
ajoo 2003-10-29
  • 打赏
  • 举报
回复
不对。错误码和异常一样,表示错误已经发生了。只不过表示的手段有所不同。

iterator也一样,异常的开销仍然不大。尤其当你的循环很大的时候。
truezerg 2003-10-29
  • 打赏
  • 举报
回复
我觉得更科学的提法应该是“不应该发生”。用数组那个例子,你就不应该让它越界。用流的这个例子,你就不应该在eof上getData()。何必非要纠缠异常是否一定发生呢?
--------------------
zerg: 错误码的用意就是为了让“一定发生的事情”“不应该发生”。 数据的例子正好是不让它越界啊。 而用异常却让不应该发生的事情发生了,才去处理。

你还没理解我说的一定发生的意思。是一定发生的异常用错误码方式避免发生,不是让异常一定发生。 你用异常处理才是让异常一定发生呢。
ajoo 2003-10-29
  • 打赏
  • 举报
回复
我怎么看不懂你在说什么了?

每个文件一个循环,外面catch异常,有什么问题吗?

而且,我们比较方案,要看各个方案的有点缺点是不是?我已经说了,isEof()的方法是最好的。而你的data==0是最差的。
理由我就不用再重复一遍了吧?

至于异常开销,我只简单地说一句:对于这种循环里只抛出一次异常的情况,可以忽略,不要说还是昂贵的io的循环。

至于什么该不该浪费了,这要看你节省这一秒钟是不是值得,这个data==0造成的设计问题,绝对比这一点点效率差别大的多。


最后,iterator的好处在于它是用hasNext(),而不是用返回特殊值给next()来表示错误。
这正好说明了我的hasNext()预防错误好于产生异常,而异常好于用特殊返回值表示错误。
truezerg 2003-10-29
  • 打赏
  • 举报
回复
知道某件事可能造成错误,并且知道怎么去避免,为什么不去避免呢?

- 这正是错误码的用意啊

等错误发生了,无论用异常还是用错误码,都不如错误没有发生,对不对?

- 用错误码就是为了避免错误不要发生啊。

对了,你说io占的时间比例很大,所以异常的开销可乎略。那Iterator那种情况呢? 倒底它的时间比例如何? 况且异常不仅仅是浪费时间,也浪费空间啊
加载更多回复(49)

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧