我正在开发一个需要读取、操作和写入 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 相关异常的可能原因:
how should I handle them?
就像你对待所有异常一样:
如果可以处理异常,即修复其原因或采取其他措施,则捕获它并在 catch block 中运行异常处理程序代码。
如果您无法处理异常,请让调用者处理它。对于已检查的异常,最简单的方法就是在您的方法 throw 子句中声明它。 您还可以捕获异常以将其转换为另一种类型(另一个已检查的异常、RuntimeException 甚至错误)。如果您不想在方法签名中包含已检查的异常,则可以使用转换为 RuntimeException(例如 IllegalStateException)。
你的例子:
您的方法可能不会失败(没有磁盘 IO 操作、没有语法错误、所有参数都正确等)。
您仍然无法处理 异常,因此您需要将其传递给调用者。
对于这两种方法,如果方法声明 XPathExpressionException 和 TransformerException 可能会令人恼火(但仍然合理)。
如果你问我,我会捕获 XPathExpressionException 和 TransformerException 并将它们重新抛出到 IllegalStateException 中。
关于java - Java中如何处理XML相关的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32191145/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我在理解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
我正在学习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
我正在尝试从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
在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
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我正在尝试使用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
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht