??xml version="1.0" encoding="utf-8" standalone="yes"?>久久综合欧美,午夜精品区一区二区三,日韩二区三区http://www.aygfsteel.com/Harriet/category/27743.html ——等待飘雪的日子...努力,努力,再努?zh-cnMon, 03 Dec 2007 10:30:03 GMTMon, 03 Dec 2007 10:30:03 GMT60Java ?.Net 在异常处理机制上的区?/title><link>http://www.aygfsteel.com/Harriet/archive/2007/12/03/164789.html</link><dc:creator>Harriet</dc:creator><author>Harriet</author><pubDate>Mon, 03 Dec 2007 02:17:00 GMT</pubDate><guid>http://www.aygfsteel.com/Harriet/archive/2007/12/03/164789.html</guid><wfw:comment>http://www.aygfsteel.com/Harriet/comments/164789.html</wfw:comment><comments>http://www.aygfsteel.com/Harriet/archive/2007/12/03/164789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Harriet/comments/commentRss/164789.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Harriet/services/trackbacks/164789.html</trackback:ping><description><![CDATA[转蝲于:http://www.tangrui.net/2007/01/09/difference-between-java-and-dotnet-on-exception-handling/<br />  <br /> 关于 Java ?.Net 优劣的争Z直在l箋Q而在异常处理斚w体现得最为激烈,因ؓ他们之间的差异是如此明显?Net 晚于 Java 出现Q那?Java ?.Net q应v到很重要的借鉴作用Q但是伟大的 Anders Hejlsberg Z么没有l? Java 的实现方式,而是另辟y径Q这是一个非常值得研究的问题。因为我们要承认一个真理:正确的东西大安是一L正确Q错误的却各有个的错误。可以肯定这不可 能是 Anders 的疏忽,那么他的道理I竟何在Q或者说他们之间I竟有什么区? <p>      在你能耐下心来看完q篇帖子之前Q我惌明确告诉你一个结论:<strong>Java ?.Net 在异常处理的本质上是没有区别的?/strong></p> <p style="font-size: 1.5em; font-weight: 600;">一、Java 是如何处理异常的</p> <p>      如果一?Java Ҏ要抛出异常,那么需要在q个Ҏ后面?throws 关键字定义可以抛出的异常cd。倘若没有定义Q就认ؓ该方法不抛出M异常。如果从Ҏ的入口和出口的角度去考虑一下这个规范,我们知道参数可以认ؓ是方 法的入口Q当然某些情况下也可以是出口Q,而返回值则是方法的出口Q这是在E序正常执行的情况下Q数据从入口入,出口出。要是程序非正常执行Q生异常又 当如? 被抛出的异常应该如何从方法中释放出来? Java 的这U语法规范就如同l异常开了一个后门,让异常可以堂而皇?#8220;正确”CҎ里被抛出?/p> <p>      <strong>q样的规范决定了 Java 语法必须对异常进?try-catch?/strong>设想一下,对于以下的方法签名:</p> <pre>public void foo() throws BarException { ... }<br /> </pre> <p>暗含了两斚w的意思:W一Q该Ҏ要抛?BarException cd的异常;W二Q除?BarException 外不能抛出其他的异常。而正是这W二点的~故Q我们要如何保证没有?BarException 之外的Q何异常被抛出? 很显Ӟ需? try-catch 其他的异常。也是_一般情况下Q?strong>Ҏ不抛出哪些异常就要在Ҏ内部 try-catch q些异常?/strong> </p> <p>      Java q样的机制既有优点,也有~点。先来说说优点:</p> <ul> <li>很显Ӟq种规范是由 Java ~译器决定的。倘若 Java E序的入口点 main() Ҏ没有M异常抛出Q就是说要在 main() Ҏ内部Q即整个E序内部捕捉所有的异常Q否则将无法通过~译。这L译器保证了程序对每个异常都有相应的计划和处理Q不会有未处理的异常被泄露到虚拟? 中,DE序意外中断或退出,也就是增ZE序的健壮性。当ӞJava ?RuntimeException 的概念,q样的异总然可以随时被抛出到虚拟机中?/li> <li> try-catch 要求把异怽为程序设计的一部分看待。就如同Ҏ的参数和q回gP在编写一个方法时Q要l合上下文做出通盘的考虑和打。虽然异常是所谓的“意外情况”Q但是这?#8220;例外”理应是被我们全部了解q处理的?/li> <li>方便调试。异常理应在正确的位|被捕捉。当异常发生Ӟ我们能更清楚的了解到其来源和相应处理E序的位|,而免M在整个调用栈中摸索的ȝ?/li> <li>在不借助M文的情况下Q从Ҏ{֐可以知晓应该对哪些异常q行处理?/li> </ul> <p>      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> <p style="font-size: 1.5em; font-weight: 600;">二?Net 是如何处理异常的</p> <p>      一句话概括 .Net 的异常处理方式就是随心所ƌӀ没有h要求你一定要抛出异常Q也更没有h要求你一定要捕捉异常。未被捕捉的异常会被?Unhandled Exception 的Ş式抛出到虚拟Z。在此我p先解决一下文章开头提到的问题Qؓ什么说 Java ?.Net q两U异常处理机制在本质上是相同的。可以从两个斚w来考虑Q?/p> <ol> <li>默认情况下。Java 在默认情况下 main() Ҏ是不抛出异常的,正如前面所说的Q这要求所有的异常都必d main() Ҏ内部被捕捉;?.Net 则没有这U约束,他的 Main() 以至于整个应用程序中的Q何一个方法对异常都是完全开攄。这h看,q两者刚好是对立互补的?/li> <li>非默认情况下。Java 可以通过?main() Ҏ后面?throws 关键字得整个应用程序对异常开放;?.Net 则可以通过l应用程序域QApplication DomainQ的 UnhandledException 事gd委托辑ֈ捕捉所有异常的目的Q很昄q又是对立互补的?/li> </ol> <p>因此Q就好像一个是“正反”Q一个是“反正”Q加在一?#8220;正反反正”都是一LQ对于达到控制异常的目录来说Q是没有区别的? </p> <p>      很多 Java 爱好者都鄙视 .Net 的这U行为,一斚w他oE序变得不够健壮Q因为默认情况下没有强制的办法要求所有的异常都被处理Q或被正处理;另外Q他试增加了困难Q不借助文档? 代码你将无法了解C个方法可能抛Z么异常,而当一个异常被抛出的时候,同时异常处理代码又写得不够完善,你将不得不仔l查看整个调用栈来确定异常出? 的位|,而对于这一?Java 默认是强制的?/p> <p>      但是 Anders 的想法L有道理的?/p> <ol> <li>.Net 代码写v来非常容易。这是对于初学者,或者那些只是想实现一些测试性小功能的h而言Q你完全没有必要考虑太多异常处理的细节,你要的就是写代码Q然后让? 跑v来。这L单性无疑是你希望看到的Q这L单性无疑更有利?.Net 在市Z的推qѝ由于他在这斚wq没有什么理Z的漏z,也就仍然适合构徏庞大的项目,只是感觉没有那么舒服|了?/li> <li>一定程度上增加了程序的安全性。难道不捕捉异常可以被成为是安全的吗?q个话也许要从另外一斚w来想Q前面说q,有些 Java E序员(l对不占数Qؓ了图省事Q在捕捉异常的压q下Q选择捕捉异常的基cdQ也是捕捉所有的异常。这样当有你无法处理的异常出现时Q他们就溺死 在了你的代码中,而外面的E序全然不知Q还在以一U不定的状态运行着Q这可能是危险的开始。而如果是 .NetQ那?Unhandled Exception 会被虚拟机捕PDE序异常退出,虽然q从面子上对于用户不是一个好的交代,但是深层ơ地他避免了E序在危险的状态下l箋q行?/li> </ol> <p>      MQ萝卜白菜各有所爱。我的这帖子力求公正地讨论了这个问题,希望能对你有所帮助?/p> <script type="text/javascript"><!-- google_ad_client = "pub-9635604832457057"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as_rimg"; google_cpa_choice = "CAAQycb8zwEaCNrmdvgKt1bFKJnA93M"; google_ad_channel = ""; //--></script> <p> </p> <img src ="http://www.aygfsteel.com/Harriet/aggbug/164789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Harriet/" target="_blank">Harriet</a> 2007-12-03 10:17 <a href="http://www.aygfsteel.com/Harriet/archive/2007/12/03/164789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">÷</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">лͨ</a>| <a href="http://" target="_blank">ض</a>| <a href="http://" target="_blank">౱</a>| <a href="http://" target="_blank">찲</a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӳ</a>| <a href="http://" target="_blank">ݳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">찲</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">½</a>| <a href="http://" target="_blank">־</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Զ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>