我正在开发一个需要读取、操作和编写xml文档的应用程序。在使用xml api时,我必须捕获几个异常,但我不知道如何处理它们。
请考虑以下代码:
public static void removeWhitespace(Document document)
{
XPath xPath = getXPath();
NodeList emptyTextNodes;
try
{
XPathExpression expression = xPath.compile("//text()[normalize-space(.) = '']");
emptyTextNodes = (NodeList) expression.evaluate(document, XPathConstants.NODESET);
}
catch (XPathExpressionException e)
{
// How to handle this?
return;
}
int nEmptyTextNodes = emptyTextNodes.getLength();
for (int i = 0; i < nEmptyTextNodes; ++i)
{
Node node = emptyTextNodes.item(i);
node.getParentNode().removeChild(node);
}
}
The documentation for
XPath#compile
表示如果“无法编译表达式”,则会抛出XPathExpressionException
。但是,在这种情况下,表达式是硬编码的,并且(可能)是有效的,因此不应该发生这种情况。因为这是一个检查异常,我必须处理它-但是我应该在catch块中做什么?类似地,the documentation for
XPathExpression#evaluate
表示如果“无法计算表达式”,则会抛出XPathExpressionException
。因为我相信表达式是有效的,所以我认为发生这种情况的唯一方法是调用方传递一个无效的Document
。我该怎么处理?考虑这个方法:
public static String documentToString(Document document)
{
StringWriter writer = new StringWriter();
try
{
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(document), new StreamResult(writer));
}
catch (TransformerException e)
{
// What happens now?
return null;
}
String xml = writer.getBuffer().toString();
// No need to close the StringWriter
return xml;
}
TransformerFactory#newTransformer
将抛出transformerconfigurationexception(将链接文档,但不允许我)“当无法创建transformer实例时”。怎么会这样?我该怎么处理?我可以声明抛出这些异常,但这只会将问题转移到其他地方。
在什么情况下会抛出这些异常,我应该如何处理它们?
最佳答案
在什么情况下会抛出这些异常
以下是javax.xml
包中与xml/xpath/xslt相关的异常的可能原因:
传递给API方法的参数无效
使用实现不支持的可选配置
读取源或写入结果时出现IO和编码错误
分析xml文档、xslt样式表、xpath表达式时出现语法错误
执行无效操作导致的错误(例如,在xpath中:对字符串或数字调用节点集函数)
任何其他运行时错误,很可能是由实现中的错误引起的
我该怎么处理?
就像你对待所有例外一样:
如果可以处理异常,即修复其原因或采取其他操作,则捕获它并在catch块中运行异常处理程序代码。
如果你不能处理异常,让调用者来处理。对于已检查的异常,最简单的方法是在methods throw子句中声明它。
您还可以捕获异常以将其转换为其他类型(另一个选中的异常、运行时异常甚至错误)。如果不想在方法签名中包含选中的异常,则可以使用转换为运行时异常(例如,IllegalStateException)。
举个例子:
您的方法可能不会失败(没有磁盘IO操作、没有语法错误、所有参数都正常等等)。
仍然无法处理异常,因此需要将其传递给调用方。
在这两种方法的情况下,如果方法声明XPathExpressionException
和TransformerException
,则可能会令人恼火(但仍然是合理的)。
如果你问我,我会抓住XPathExpressionException
和TransformerException
并重新将它们包装成IllegalStateException
。