WEB开发网
开发学院WEB开发Jsp 如何处理Java里的DOM异常 阅读

如何处理Java里的DOM异常

 2008-01-05 08:59:15 来源:WEB开发网   
核心提示:在使用基于java的xml剖析器时,你经常要应付异常(exception)的处理,如何处理Java里的DOM异常,有些异常很轻易处理,而其他的要更困难一些,它还让我们能够更轻易地重新使用异常处理器的代码,我们现在不用每次需要的时候才剪切和粘贴事件处理器代码,在本文里,我们会看一些在使用XML文档时常见的异常

  在使用基于java的xml剖析器时,你经常要应付异常(exception)的处理。有些异常很轻易处理,而其他的要更困难一些。在本文里,我们会看一些在使用XML文档时常见的异常,并探讨一下如何处理好这些异常。

DOM异常

在使用DOM剖析器进行剖析操作的时候,XML文档会被立即处理并保存在内存里。内存里的对象会被做一个文档对象模型(Document Object Model)来参照??这基本上就是一种用于访问底层XML文档的面向对象的方法。在DOM里处理XML文档的时候,很多东西都会出错。

大多数DOM下的异常都是作为DOMException类的一个实例发生的。这个类支持15种不同的、具体的异常条件。每种条件都被指定为DOMException类的一个成员,叫做code。除了这个code成员,DOMException类还包含一组15个静态成员,它们被用来确定异常的条件。

这15个条件是:

DOMSTRING_SIZE_ERR
HIERARCHY_REQUEST_ERR
INDEX_SIZE_ERR
INUSE_ATTRIBUTE_ERR
INVALID_access_ERR
INVALID_CHARACTER_ERR
INVALID_MODIFICATION_ERR
INVALID_STATE_ERR
NAMESPACE_ERR
NO_DATA_ALLOWED_ERR
NO_MODIFICATION_ALLOWED_ERR
NOT_FOUND_ERR
NOT_SUPPORTED_ERR
SYNTAX_ERR
WRONG_DOCUMENT_ERR
当DOMException出现的时候,假如不检查异常对象里的code,那么你就不会知道到底是这些条件中的哪一个导致了这个异常。为了正确地处理这个异常,你将需要确定是哪个条件导致了这个异常。
Listing A显示了一个Java程序,它创建新的DOM文档失败了:

Listing A: DOMFail.Java
import org.apache.xerces.dom.*;
import org.w3c.dom.*;

public class DOMFail {

public static void main(String[] args) {
Document doc = new DocumentImpl();
Element rootElement;

try{
rootElement = doc.createElement("Order");
rootElement.setAttribute("〈id", "109823");
doc.appendChild( rootElement );
} catch (DOMException e) {
switch(e.code) {
case DOMException.DOMSTRING_SIZE_ERR:
break;
case DOMException.HIERARCHY_REQUEST_ERR:
break;
case DOMException.INDEX_SIZE_ERR:
break;
case DOMException.INUSE_ATTRIBUTE_ERR:
break;
case DOMException.INVALID_ACCESS_ERR:
break;
case DOMException.INVALID_CHARACTER_ERR:
System.out.PRintln("There is an invalid character");
break;
case DOMException.INVALID_MODIFICATION_ERR:
break;
case DOMException.INVALID_STATE_ERR:
break;
case DOMException.NAMESPACE_ERR:
break;
case DOMException.NO_DATA_ALLOWED_ERR:
break;
case DOMException.NO_MODIFICATION_ALLOWED_ERR:
break;
case DOMException.NOT_FOUND_ERR:
break;
case DOMException.NOT_SUPPORTED_ERR:
break;
case DOMException.SYNTAX_ERR:
break;
case DOMException.WRONG_DOCUMENT_ERR:
break;
default:
System.out.println("Unknown DOM exception");
break;
}
}
}
}

要注重,我们使用了一种切换机制来确定到底满足了哪个条件。这样我们就可以很轻易地测试每个条件,直到我们找到正确的那个。

在这个例子里,我们已经在用于无效字符的条件里放置了一条消息。当你编译并运行这个例子的时候,你会看到这样一条信息:存在非法字符(There is an invalid character)。你会希望正确地处理每个条件,而不是将条件留作空白。
你可能想要提取出条件异常的处理(方法),并将它放置到它自己的方法里,甚至是它自己的类里。那样的话,你就可以在你的代码里放入更加简单的异常处理机制。例如,我们可以创建一个叫做DOMExceptionHandler的新类,如Listing B所示:

Listing B: DOMExceptionHandler.Java
import org.w3c.dom.*;

public class DOMExceptionHandler {
public static void HandleDOMException(DOMException e) {
if (e != null) {
switch(e.code) {
case DOMException.DOMSTRING_SIZE_ERR:
break;
case DOMException.HIERARCHY_REQUEST_ERR:
break;
case DOMException.INDEX_SIZE_ERR:
break;
case DOMException.INUSE_ATTRIBUTE_ERR:
break;
case DOMException.INVALID_ACCESS_ERR:
break;
case DOMException.INVALID_CHARACTER_ERR:
System.out.println("There is an invalid character");
break;
case DOMException.INVALID_MODIFICATION_ERR:
break;
case DOMException.INVALID_STATE_ERR:
break;
case DOMException.NAMESPACE_ERR:
break;
case DOMException.NO_DATA_ALLOWED_ERR:
break;
case DOMException.NO_MODIFICATION_ALLOWED_ERR:
break;
case DOMException.NOT_FOUND_ERR:
break;
case DOMException.NOT_SUPPORTED_ERR:
break;
case DOMException.SYNTAX_ERR:
break;
case DOMException.WRONG_DOCUMENT_ERR:
break;
default:
System.out.println("Unknown DOM exception");
break;
}
}
}
}
既然我们有了用来处理DOM异常的专用处理器类,那么我们就可以从我们的处理代码里调用它。Listing C里的代码是对DOMFail类的一个修正,它使用了我们新的DOMExceptionHandler类:

Listing C: DOMFail2.Java
import org.apache.xerces.dom.*;
import org.w3c.dom.*;

public class DOMFail2 {

public static void main(String[] args) {
Document doc = new DocumentImpl();
Element rootElement;

try{
rootElement = doc.createElement("Order");
rootElement.setAttribute("〈id", "109823");
doc.appendChild( rootElement );
} catch (DOMException e) {
DOMExceptionHandler.HandleDOMException(e);
}
}
}

这个新的类要比我们原来的DOMFail类简单得多。它还让我们能够更轻易地重新使用异常处理器的代码。我们现在不用每次需要的时候才剪切和粘贴事件处理器代码,而只是调用DOMExceptionHandler类就行了。

Tags:如何 处理 Java

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接