|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。
在年夜多半Java项目中,年夜部分代码都是榜样代码。非常处置就属于此类代码。即便营业逻辑只要3到4行代码,用于非常处置的代码也要占10到20行。本文将会商怎样让非常处置坚持复杂和直不雅,使开辟职员能够用心于开辟营业逻辑,而不是把工夫华侈在编写非常处置的榜样代码上。本文还将申明用于在J2EE情况中创立和处置非常的基本常识和引导准绳,并提出了一些可使用非常办理的营业成绩。本文将利用Struts框架作为暗示完成,但该办法合用于任何暗示完成。
利用checked和unchecked非常的场景
您是不是已经想过,为何要在编写好的代码块四周安排一个try-catch块,即使明晓得没法对这些非常举行甚么处置,而只满意于把它们放在catch块中?您大概想晓得,为何不克不及把这项事情放在一个会合的中央完成?在年夜多半情形下,这个中央关于J2EE使用程序来讲就是一个前端把持器。换句话说,开辟职员不会由于它们而遭到搅扰,由于基本不用良多地干涉它们。可是,假如一个办法称号包括一个throws子句,会呈现甚么情形呢?开辟职员大概必需捕获这些非常,大概把它们放在本人的办法的throws子句中。这就是疾苦的本源!侥幸的是,JavaAPI有一类叫做uncheckedexception的非常,它们不用捕获。可是,仍旧存在一个成绩:依据甚么来决意哪些是checked非常,哪些是unchecked非常?上面给出一些引导准绳:
终端用户没法接纳无效操纵的非常应当作为unchecked非常。比方,致命的和不成恢复的非常就应当是unchecked。把XMLParseException(在剖析XML文件时抛出)作为checked非常没有任何意义,由于唯一可以接纳的措施就是基于非常跟踪来办理基本成绩。经由过程扩大java.lang.RuntimeException,能够创立自界说的unchecked非常。
在使用程序中,与用户操纵相干的非常应当是checked非常。checked非常请求客户端来捕获它们。您大概会问,为何不把一切非常都看成是unchecked。如许做的成绩在于,个中一些非常没法在准确的地位被捕获到。这会带来更年夜的成绩,由于毛病只要在运转时才干被辨认。checked非常的例子有营业确认非常、平安性非常等等。
非常抛出战略
只捕获基础使用程序非常(假定为BaseAppException)并在throws子句中声明
在年夜多半J2EE使用程序中,关于针对某个非常应当在哪一界面上显现哪条毛病动静的决议只能在暗示层中做出。这会带来另外一个成绩:为何我们不克不及把这类决议放在一个大众的中央呢?在J2EE使用程序中,前端把持器就是一个举行罕见处置的会合地位。
别的,必需有一种用于传布非常的通用机制。非常也必要以一种普适的体例失掉处置。为此,我们一直必要在把持器端捕获基础使用程序非常BaseAppException。这意味着我们必要把BaseAppException非常(只要这个非常)放进能够抛出checked非常的每一个办法的throws子句中。这里的观点是利用多态来埋没非常的实践完成。我们在把持器中捕获BaseAppException,可是所抛出的特定非常实例多是几个派生非常类中的恣意一个。借助于这类办法,能够取得很多非常处置方面的天真性:
不必要在throws子句中放进大批的checked非常。throws子句中只必要有一个非常。
不必要再对使用程序非常利用凌乱的catch块。假如必要处置它们,一个catch块(用于BaseAppException)就充足了。
开辟职员不必要亲身举行非常处置(日记纪录和猎取毛病代码)。这类笼统是由ExceptionHandler完成的,稍后本文会就此点举行会商。
即便稍后把更多非常引进到办法完成中,办法称号也不会改动,因而也不必要修正客户端代码,不然就会引发连锁反响。但是,抛出的非常必要在办法的Javadoc中指定,以便让客户端能够看到办法束缚。
上面给出抛出checked非常的一个例子:
publicvoidupdateUser(UserDTOuserDTO)
throwsBaseAppException{
UserDAOuserDAO=newUserDAO();
UserDAO.updateUser(userDTO);
...
if(...)
thrownewRegionNotActiveException("Selectedregionisnotactive");
}
ControllerMethod:
...
try{
Useruser=newUser();
user.updateUser(userDTO);
}catch(BaseAppExceptionex){
//ExceptionHandlerisusedtohandle
//allexceptionsderivedfromBaseAppException
}
...
<p>
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。 |
|