Scala:类型 None 的表达式。类型未确认期望类型文档
Scala : Expression of Type None. Type doesn't confirm to expect type Document
我是 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
但是这里显示错误 "Expression of Type None. Type doesn't confirm to expect type Document" 因为我的 return 类型是文档。
有人可以帮我解决这个问题吗?提前致谢
如果您想使用包装器,例如 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
}
}
我是 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
但是这里显示错误 "Expression of Type None. Type doesn't confirm to expect type Document" 因为我的 return 类型是文档。
有人可以帮我解决这个问题吗?提前致谢
如果您想使用包装器,例如 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
}
}