Scala Try,Else,除了阻止

时间:2016-07-20 05:29:27

标签: scala error-handling try-catch

我有这样的代码:

val extractInfo: (Array[Byte] => String) = (fp: Array[Byte]) => {

  val parser:Parser = new AutoDetectParser()
  val handler:BodyContentHandler = new BodyContentHandler(Integer.MAX_VALUE)
  val config:TesseractOCRConfig  = new TesseractOCRConfig()
  val pdfConfig:PDFParserConfig = new PDFParserConfig()

  val inputstream:InputStream = new ByteArrayInputStream(fp)

  val metadata:Metadata = new  Metadata()
  val parseContext:ParseContext = new ParseContext()
  parseContext.set(classOf[TesseractOCRConfig], config)
  parseContext.set(classOf[PDFParserConfig], pdfConfig)
  parseContext.set(classOf[Parser], parser)
  parser.parse(inputstream, handler, metadata, parseContext)

  handler.toString
}

使用Apache Tika从PDF解析文本的函数文字。

我想要的是这里的一个Try块,它运行在parser.parse上,如果它不能执行则返回一个空字符串。我不确定如何在Scala中构造这种逻辑。

2 个答案:

答案 0 :(得分:4)

我认为你要找的是Try

val extractInfo: (Array[Byte] => String) = (fp: Array[Byte]) => Try {
  val parser:Parser = new AutoDetectParser()
  ...
  handler.toString
} getOrElse("")

这样做会捕获正文中的任何错误,并通过返回空字符串从此错误中恢复。

答案 1 :(得分:2)

你可以写

try {
  val parser:Parser = new AutoDetectParser()
  val handler:BodyContentHandler = new BodyContentHandler(Integer.MAX_VALUE)
  val config:TesseractOCRConfig  = new TesseractOCRConfig()
  val pdfConfig:PDFParserConfig = new PDFParserConfig()

  val inputstream:InputStream = new ByteArrayInputStream(fp)

  val metadata:Metadata = new  Metadata()
  val parseContext:ParseContext = new ParseContext()
  parseContext.set(classOf[TesseractOCRConfig], config)
  parseContext.set(classOf[PDFParserConfig], pdfConfig)
  parseContext.set(classOf[Parser], parser)
  parser.parse(inputstream, handler, metadata, parseContext)

  handler.toString
} catch {
  case e: Exception => ""
}

因为try是Scala中的表达式,就像ifmatch一样。但是,如果您打算使用""作为标记值(即,稍后通过检查结果是否为空来检查是否发生错误),请不要;改为使用Option[String]Try[String]作为返回类型。