Scala Try,Else,block除外

Scala Try,Else,block除外,scala,error-handling,try-catch,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 Tessera

我有这样的代码:

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
}
使用ApacheTika解析PDF中文本的函数文本


不过,我希望这里有一个Try块,它在parser.parse上运行,如果无法执行,则返回一个空字符串。我不知道如何在Scala中构造这种逻辑。

我想您需要的是


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

我认为您要查找的是

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

您只需编写

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中的一个表达式,就像if或match一样。但是,如果您打算将其用作sentinel值,也就是说,请稍后通过检查结果是否为空来检查是否发生了错误,不要;使用选项[String]或尝试使用[String]作为返回类型。

您只需编写

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中的一个表达式,就像if或match一样。但是,如果您打算将其用作sentinel值,也就是说,请稍后通过检查结果是否为空来检查是否发生了错误,不要;使用选项[String]或尝试使用[String]作为返回类型。

这正是我想要的。谢谢。注意,这个scala.util.Try类不同于小写的scala Try/catch/finally关键字语法。我花了一段时间才注意到大写的T,所以这可能会帮助其他人。此外,上面的链接已断开,所以我引用了它的永久导入位置。这正是我要找的。谢谢。注意,这个scala.util.Try类不同于小写的scala Try/catch/finally关键字语法。我花了一段时间才注意到大写的T,所以这可能会帮助其他人。此外,上面的链接已断开,因此我引用了它的永久导入位置。