【发布时间】:2023-03-23 13:25:01
【问题描述】:
我正在开发一个需要读取、操作和编写 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 (将链接文档但 SO 不会让我)“当无法创建 Transformer 实例时”。这怎么可能发生?我该如何处理?
我可以声明要抛出这些异常,但这只会将问题转移到其他地方。
在什么情况下会抛出这些异常,应该如何处理?
【问题讨论】: