【问题标题】:Scala Try, Else, Except blockScala Try, Else, 除了块
【发布时间】:2016-07-20 05:29:26
【问题描述】:

我有这样的代码:

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 中解析文本的函数文字。

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

【问题讨论】:

    标签: scala error-handling try-catch


    【解决方案1】:

    我想你要找的是Try。

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

    它的作用是捕获正文中的任何错误并通过返回空字符串从该错误中恢复。

    【讨论】:

    • 这正是我想要的。谢谢。
    • 注意,这个 scala.util.Try 类不同于(小写)scala try/catch/finally 关键字语法。我花了一段时间才注意到大写的“T”,所以也许这对其他人有帮助。 (此外,上面的链接已损坏,因此我引用了它的永久导入位置)。
    【解决方案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 中的表达式,就像if 或match。但是,如果您打算使用"" 作为标记值(即稍后通过检查结果是否为空来检查是否发生错误),请不要;改用Option[String] 或Try[String] 作为返回类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-24
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 2019-01-27
      • 1970-01-01
      相关资源
      最近更新 更多