在你能耐下心来看完q篇帖子之前Q我惌明确告诉你一个结论:Java ?.Net 在异常处理的本质上是没有区别的?/strong>
一、Java 是如何处理异常的
如果一?Java Ҏ要抛出异常,那么需要在q个Ҏ后面?throws 关键字定义可以抛出的异常cd。倘若没有定义Q就认ؓ该方法不抛出M异常。如果从Ҏ的入口和出口的角度去考虑一下这个规范,我们知道参数可以认ؓ是方 法的入口Q当然某些情况下也可以是出口Q,而返回值则是方法的出口Q这是在E序正常执行的情况下Q数据从入口入,出口出。要是程序非正常执行Q生异常又 当如? 被抛出的异常应该如何从方法中释放出来? Java 的这U语法规范就如同l异常开了一个后门,让异常可以堂而皇?#8220;正确”CҎ里被抛出?/p>
q样的规范决定了 Java 语法必须对异常进?try-catch?/strong>设想一下,对于以下的方法签名:
public void foo() throws BarException { ... }
暗含了两斚w的意思:W一Q该Ҏ要抛?BarException cd的异常;W二Q除?BarException 外不能抛出其他的异常。而正是这W二点的~故Q我们要如何保证没有?BarException 之外的Q何异常被抛出? 很显Ӟ需? try-catch 其他的异常。也是_一般情况下Q?strong>Ҏ不抛出哪些异常就要在Ҏ内部 try-catch q些异常?/strong>
Java q样的机制既有优点,也有~点。先来说说优点:
Java 异常处理机制的这些优点也直接D了他的致命弱点:程序变得异常繁复。往往一个简单的E序Q功能代码寥寥几行,而异常处理部分却占用了程序的l大部分? q;同时D~进深度加深Q既不利于书写,也不利于阅读。另外他的强?try-catch 需要程序员有更高深的造诣Q能够通盘考虑异常处理设计问题Q这个在E序开始之初或者对于初学者是一个不的门槛。这往往会阻其推广与发展,因ؓ低水q_ 学者的信心往往因此而受到打凅R然而对于高手来_~译器是否能帮助他们扑ֈ未被处理的异常只是一个方便与否的问题Q只要在~写Ҏ时注意了异常处理Q即 便没有编译器的支持,情况也不会糟p太多。反而倒是׃要遵循这样复杂的异常处理规范Q以至于大多Ch都可能ؓ了图一时方便,对异常的基类? Exception ?Throwable q行W统地捕捉,q样做的危害是那些你无法处理的异常被hd处理E序中,Q按照异常处理原则,我们应该只捕捉那些可以被处理或恢复的异常Q而把其他? 异常l箋抛出。至于这样做的优势,以及不这样做所带来的问题,不是一两句能够说清楚,q里׃展开讨论了。)DE序的不E_和不定。既没有发挥 Java 语法在这斚w的优势,反而增加了忧患?/p>
二?Net 是如何处理异常的
一句话概括 .Net 的异常处理方式就是随心所ƌӀ没有h要求你一定要抛出异常Q也更没有h要求你一定要捕捉异常。未被捕捉的异常会被?Unhandled Exception 的Ş式抛出到虚拟Z。在此我p先解决一下文章开头提到的问题Qؓ什么说 Java ?.Net q两U异常处理机制在本质上是相同的。可以从两个斚w来考虑Q?/p>
因此Q就好像一个是“正反”Q一个是“反正”Q加在一?#8220;正反反正”都是一LQ对于达到控制异常的目录来说Q是没有区别的?
很多 Java 爱好者都鄙视 .Net 的这U行为,一斚w他oE序变得不够健壮Q因为默认情况下没有强制的办法要求所有的异常都被处理Q或被正处理;另外Q他试增加了困难Q不借助文档? 代码你将无法了解C个方法可能抛Z么异常,而当一个异常被抛出的时候,同时异常处理代码又写得不够完善,你将不得不仔l查看整个调用栈来确定异常出? 的位|,而对于这一?Java 默认是强制的?/p>
但是 Anders 的想法L有道理的?/p>
MQ萝卜白菜各有所爱。我的这帖子力求公正地讨论了这个问题,希望能对你有所帮助?/p>