在使用基于Java的XML剖析器時(shí),你常常要應(yīng)付異常(exception)的處理。有些異常很容易處理,但是有些異常卻很難處理。在這一篇文章中,我們將看到在使用XML文檔時(shí)碰到的一些常見異常,并探討一下如何正確地處理這些異常。
DOM異常
在使用DOM剖析器進(jìn)行剖析操作的時(shí)候,XML文檔會被立即處理并保存在內(nèi)存。內(nèi)存里的對象將被處理為一個(gè)文檔對象模型(Document Object Model)――這基本上就是一種用于訪問底層XML文檔的面向?qū)ο蟮姆椒āT贒OM里處理XML文檔的時(shí)候,很多東西都會出現(xiàn)錯(cuò)誤。
大多數(shù)DOM下的異常都是作為DOMException類的一個(gè)實(shí)例發(fā)生的。這一個(gè)類支持15種不同的、具體的異常條件。每種條件都被指定為DOMException類的一個(gè)成員,叫做code。除了這個(gè)code成員,DOMException類還包含一組15個(gè)靜態(tài)成員,它們被用來確定異常的條件。
當(dāng)DOMException出現(xiàn)的時(shí)候,如果不檢查異常對象里的code,那么你就不會知道到底是這些條件中的哪一個(gè)導(dǎo)致了這個(gè)異常。為了正確地處理這個(gè)異常,你將需要確定是哪個(gè)條件導(dǎo)致了這個(gè)異常。
Listing A顯示了一個(gè)Java程序,這一程序在創(chuàng)建新的DOM文檔時(shí)由于錯(cuò)誤而無法通過。. 點(diǎn)擊這里可以查看程序源代碼。
要注意,我們使用了一種切換機(jī)制來確定到底滿足了哪個(gè)條件。這樣我們就可以很容易地測試每個(gè)條件,直到我們找到正確的條件。
在以上范例中,我們已經(jīng)在用于無效字符的條件里放置了一條消息。當(dāng)你編譯并運(yùn)行這個(gè)例子的時(shí)候,你會看到這樣一條信息:存在非法字符(There is an invalid character)。你會希望正確地處理每個(gè)條件,而不是將條件留為空白。
你可能想要提取出條件異常的處理(方法),并將它放置到它自己的方法里,甚至是它自己的類里。那樣的話,你就可以在你的代碼里放入更加簡單的異常處理機(jī)制。例如,我們可以創(chuàng)建一個(gè)叫做DOMExceptionHandler的新類,如Listing B所示,可以點(diǎn)擊此處查看源代碼。
既然我們有了用來處理DOM異常的專用處理器類,那么我們就可以從我們的處理代碼里調(diào)用它。Listing C里的代碼是對DOMFail類的一個(gè)修正,它使用了我們新的DOMExceptionHandler類,可以點(diǎn)擊這里查看代碼。
這個(gè)新的類要比我們原來的DOMFail類簡單得多。它還可以讓我們能夠更容易地重新使用異常處理器的代碼。我們現(xiàn)在不用每次需要的時(shí)候才剪切和粘貼事件處理器代碼,而只是調(diào)用DOMExceptionHandler類就可以了。