jjzjj

java - Java中如何处理XML相关的异常?

coder 2024-07-05 原文

我正在开发一个需要读取、操作和写入 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 block 中做什么?

同样,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 实例时”。这怎么可能发生?我该如何处理?

我可以声明抛出这些异常,但这只会将问题转移到其他地方。

这些异常在什么情况下会抛出,应该如何处理?

最佳答案

Under which circumstance will these exceptions be thrown

这些是 javax.xml 包中 XML/XPath/XSLT 相关异常的可能原因:

  • 传递给 API 方法的参数无效
  • 使用可选的且不受实现支持的配置
  • 读取 Source 或写入 Result 时出现 IO 和编码错误
  • 解析 XML 文档、XSLT 样式表、XPath 表达式时出现语法错误
  • 执行无效操作导致的错误(例如,在 XPath 中:对字符串或数字调用节点集函数)
  • 任何其他运行时错误,很可能是由实现中的错误引起的

how should I handle them?

就像你对待所有异常一样:

如果可以处理异常,即修复其原因或采取其他措施,则捕获它并在 catch block 中运行异常处理程序代码。

如果您无法处理异常,请让调用者处理它。对于已检查的异常,最简单的方法就是在您的方法 throw 子句中声明它。 您还可以捕获异常以将其转换为另一种类型(另一个已检查的异常、RuntimeException 甚至错误)。如果您不想在方法签名中包含已检查的异常,则可以使用转换为 RuntimeException(例如 IllegalStateException)。

你的例子:

您的方法可能不会失败(没有磁盘 IO 操作、没有语法错误、所有参数都正确等)。 您仍然无法处理 异常,因此您需要将其传递给调用者。 对于这两种方法,如果方法声明 XPathExpressionExceptionTransformerException 可能会令人恼火(但仍然合理)。 如果你问我,我会捕获 XPathExpressionExceptionTransformerException 并将它们重新抛出到 IllegalStateException 中。

关于java - Java中如何处理XML相关的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32191145/

有关java - Java中如何处理XML相关的异常?的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  4. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  5. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  6. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  7. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

随机推荐