2016-07-20 11 views
0

Ich habe Code wie folgt aus:Scala Versuchen Sie, Else, außer Block

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 
} 

A Funktionsliteral, die Text aus PDF-Dateien unter Verwendung von Apache Tika analysiert.

Was ich will, ist jedoch ein Try Block hier, der auf parser.parse läuft und eine leere Zeichenfolge zurückgibt, wenn es nicht ausgeführt werden kann. Ich bin mir nicht sicher, wie ich diese Art von Logik in Scala konstruieren soll.

Antwort

4

Ich denke, was Sie suchen, ist Try.

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

Was das bedeutet ist im Körper einen Fehler fangen und diese Fehler beheben, indem Sie den leeren String zurück.

+0

Dies ist genau das, was ich gesucht habe. Vielen Dank. – tadamhicks

2

können Sie schreiben gerade

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 => "" 
} 

weil try Ausdruck in Scala ist, genau wie if oder match. Wenn Sie jedoch beabsichtigen, "" als Sentinel-Wert zu verwenden (dh später prüfen, ob ein Fehler aufgetreten ist, indem Sie prüfen, ob das Ergebnis leer ist), tun Sie dies nicht; Verwenden Sie stattdessen Option[String] oder Try[String] als Rückgabetyp.