Scala异常场景下返回自定义元组类型问题求助
解决Scala中XML解析的Try结果处理问题
嘿,我明白你遇到的问题了——你想用Scala的Try来处理XML解析逻辑,希望XML合法时返回指定的元组("xmlname", xmlvalues),不合法时返回("xmlname", null),但之前尝试用.toOption.orNull只能拿到null,没法返回符合要求的完整元组对吧?
其实核心是要对Try包装的结果做针对性处理,而不是直接把整个Try对象转成null。这里有两种简洁的实现方式:
方式一:使用模式匹配(直观清晰)
def xmlparser(xml: String): (String, List[String]) = { // 把解析逻辑包裹在Try中,捕获可能的异常 val parseResult = Try { val documentbuilder = DocumentBuilderFactory.newInstance.newDocumentBuilder val xmldocument = documentbuilder.parse(new InputSource(new java.io.StringReader(xml))) val nodesofchild = xmldocument.getChildNodes val xmlvalues = extractvalues(nodesofchild) ("xmlname", xmlvalues) } // 对Try的结果进行模式匹配 parseResult match { case Success(validTuple) => validTuple // 解析成功,直接返回合法元组 case Failure(_) => ("xmlname", null) // 解析失败,返回指定的默认元组 } }
方式二:使用getOrElse(更简洁)
如果觉得模式匹配有点繁琐,可以直接用Try的getOrElse方法,一步到位:
def xmlparser(xml: String): (String, List[String]) = Try { val documentbuilder = DocumentBuilderFactory.newInstance.newDocumentBuilder val xmldocument = documentbuilder.parse(new InputSource(new java.io.StringReader(xml))) val nodesofchild = xmldocument.getChildNodes val xmlvalues = extractvalues(nodesofchild) ("xmlname", xmlvalues) }.getOrElse(("xmlname", null)) // 失败时直接返回默认元组
为什么这样可行?
Try会把成功的执行结果包装成Success实例,把抛出的异常包装成Failure实例。不管是模式匹配还是getOrElse,都是在明确处理这两种情况:
- 成功时,取出
Success内部的合法元组返回; - 失败时,直接返回你指定的
("xmlname", null)元组,保证返回值的结构始终符合要求。
另外提一句:在Scala里通常更推荐用Option[List[String]]替代null(比如返回("xmlname", None)),这样更符合函数式编程的风格,但既然你明确要求返回null,上面的代码完全满足你的需求。
内容的提问来源于stack exchange,提问作者sri
相关产品推荐
相关产品推荐

