我是Scala编码的新手。我有下面的代码片段,它使用documentBuilder构建文档。我的输入是XML。每当我在代码下面输入格式错误的XML时,都无法parse
并引发SAXException。
def parse_xml(xmlString: String)(implicit invocationTs: Date) : Either [None, Document] = {
try {
println(s"Parse xmlString invoked")
val document = documentBuilder(false).parse(new InputSource(new StringReader(xmlString)))
document.getDocumentElement.normalize()
//Right(document)
document
} catch {
case e: Exception => None
由于解析函数的内置实现,引发了SAXException。请参见下面的代码,其中正在处理SAXException:
public abstract Document parse(InputSource is)
throws SAXException, IOException;
现在,我正试图绕过此SAXException,因为我不希望我的工作仅因一种格式错误的XML而失败。所以我把try catch块处理放在异常下面:
case e: Exception => None
但是它在这里显示错误为“ Type of Expression ofNone。Type不能确定期望类型为Document”,因为我的返回类型是document。
有人可以帮我摆脱这个问题吗?在此先感谢
答案 0 :(得分:1)
如果要使用包装器,例如Either
或Option
,则必须包装返回值。
如果您想进一步传递异常,则比Either
更好的选择可能是Try
:
def parse_xml(xmlString: String)(implicit invocationTs: Date) : Try[Document] = {
try {
println(s"Parse xmlString invoked")
val document = documentBuilder(false).parse(new InputSource(new StringReader(xmlString)))
document.getDocumentElement.normalize()
Success(document)
} catch {
case e: Exception => Failure(e)
}
}
您甚至可以通过将块包装在Try.apply
中来简化它:
Try{
println(s"Parse xmlString invoked")
val document = documentBuilder(false).parse(new InputSource(new StringReader(xmlString)))
document.getDocumentElement.normalize()
document
}
如果您不关心异常,只关心结果,请使用Option
:
def parse_xml(xmlString: String)(implicit invocationTs: Date) : Option[Document] = {
try {
println(s"Parse xmlString invoked")
val document = documentBuilder(false).parse(new InputSource(new StringReader(xmlString)))
document.getDocumentElement.normalize()
Some(document)
} catch {
case e: Exception => None
}
}