﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我爱oo,我爱java-文章分类-java</title><link>http://www.blogjava.net/oofrank/category/7137.html</link><description>交流blog    QQ:421057986  &lt;a href="http://www.donews.net/oofrank"&gt;oofrank@donews&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:24:06 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:24:06 GMT</pubDate><ttl>60</ttl><item><title>Spring 中的异常悖论</title><link>http://www.blogjava.net/oofrank/articles/28700.html</link><dc:creator>兼听则明</dc:creator><author>兼听则明</author><pubDate>Thu, 19 Jan 2006 13:40:00 GMT</pubDate><guid>http://www.blogjava.net/oofrank/articles/28700.html</guid><wfw:comment>http://www.blogjava.net/oofrank/comments/28700.html</wfw:comment><comments>http://www.blogjava.net/oofrank/articles/28700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oofrank/comments/commentRss/28700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oofrank/services/trackbacks/28700.html</trackback:ping><description><![CDATA[这个题目可能有些危言悚听,使用Spring的同行不用害怕，只是因为工作中碰到一些问题，才偶然想到这个问题。<br><br>首先要明确几个问题：<br>1、系统隔离原则：<br>&nbsp;&nbsp;&nbsp; 即系统间依赖应该是清晰的，不因为一个系统的故障影响其他系统，甚至整个系统。<br>2、简单应用习惯：<br>&nbsp;&nbsp;&nbsp; 普通程序员只会处理checked Exception,负责任的程序员会处理被调用的函数可能抛出的异常(根据源码或javadoc)<br>&nbsp; <br><br>我们碰到一个情况：<br>使用Spring的 init 特性初试化一个bean--一个使用Qutarz的调度程序。初试化过程中会抛出RuntimeException，从而造成Spring容器的整个初试化失败。首先我们修改了程序，捕获了所有异常，在编码指南中加入了一句话："所有使用Spring-init机制初试化的类必须在init中捕获所有异常：Exception"。因为只有如此才能保证整个系统不会因为局部问题而完全瘫痪。<br><br>我觉得这是Spring对异常处理的一个悖论：<br>正方：底层异常都封装成Runtime的,经过几次包装---&gt;简单应用习惯---&gt;异常被抛出领域层(init场景下:由Spring处理)<br>反方: 一个类的失败可以造成整个系统的失败----&gt;Spring被RuntimeException宕掉----&gt;不符合系统隔离原则<br><br><br>当然充分的测试可能可以解决这个问题：但是要注意，测试只能证明系统有bug，不能证明系统没有bug。<br><br>解决方案：<br>1、好的设计习惯：将应该隔离的系统隔离开--&gt;使用不同的Spring配置文件.<br>2、接口层错误处理：在接口层应该尽量对可以处理的异常进行处理,然后以合理的方式传递给上层.<br><br><br>PS:在与人交互的系统中都应该给最终用户合理的错误提示，所以表现层应该尽量捕获非业务的RuntimeException给最终用户更好的操作感受。<img src ="http://www.blogjava.net/oofrank/aggbug/28700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oofrank/" target="_blank">兼听则明</a> 2006-01-19 21:40 <a href="http://www.blogjava.net/oofrank/articles/28700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>