2015-05-04 34 views
0

我使用Tika jar提取從Microsoft Word文檔文件的元數據,但在案件提卡遇到問題我的救援是不是捕捉錯誤,而不是腳本退出。我在Windows 7上使用MRI Ruby 1.9.3 我可以修改doc文件,但我想避免將來的文件出現此問題。 如何捕獲此錯誤?在Ruby中IO.popen運行外部程序:救援工作不

JARPATH = "jar/tika-app-1.6.jar" 

def metadata 
    return @metadata if defined? @metadata 
    switch = '-m -j' 
    begin 
     command = %Q{java -Djava.awt.headless=true -jar #{JARPATH} #{switch} "#{@path}"} 
     output = IO.popen(command+" 2>&1") do |io| 
     io.read 
     end 
     if output.respond_to?(:to_str) 
     @metadata = JSON.parse(output) 
     else 
     @metadata = nil 
     end 
    rescue => e 
     puts e 
     puts e.backtrace 
    end 
    end 

這是輸出我得到

c:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.2/lib/json/common.rb:155:in `parse': 757: unexpected token at 'Exception in thread "main" org.apache.tika.exception.TikaException: TIKA-198: Illegal IOExce 
ption from [email protected] (JSON::ParserError) 
     at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:250) 
     at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:244) 
     at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:121) 
     at org.apache.tika.cli.TikaCLI$OutputType.process(TikaCLI.java:143) 
     at org.apache.tika.cli.TikaCLI.process(TikaCLI.java:422) 
     at org.apache.tika.cli.TikaCLI.main(TikaCLI.java:113) 
Caused by: java.io.IOException: Invalid header signature; read 0x04090000002DA5DB, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document 
     at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140) 
     at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:115) 
     at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:204) 
     at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:163) 
     at org.apache.tika.parser.microsoft.OfficeParser.parse(OfficeParser.java:162) 
     at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:244) 
     ... 5 more 
' 
     from c:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.2/lib/json/common.rb:155:in `parse' 
     from C:/Users/.../tika.rb:37:in `metadata' 
     from C:/Users/.../index_helpers.rb:55:in `index_doc' 
     from index.rb:39:in `block in <main>' 
     from index.rb:20:in `each' 
     from index.rb:20:in `each_with_index' 
     from index.rb:20:in `<main>' 
+0

爲什麼不使用的(http://wiki.apache.org/tika/TikaJAXRS),而不是一個新的JVM每次調用應用程序產卵[蒂卡網絡服務器]?你會通過網絡發佈你的內容,並找回元數據或錯誤,很好地與你的ruby隔離 – Gagravarr

+0

另外,stacktrace中的具體錯誤在最新版本的Apache Tika中修復,是否有原因讓你「重新使用舊的? – Gagravarr

+0

@Gagravarr,這裏的小企業,需要儘量減少正在運行的服務器進程的數量,只有運行的web服務器是一個IIS和一個我不想使用的Tomcat。 Tika與我希望不使用的Yomi Gem一起安裝,但是沖泡我自己的班級與Tika互動。 Tika在從命令行運行時會出現相同的錯誤,我將查看該新版本。 – peter

回答

2

您的來電後IO.popen你是從孩子程序的輸出傳遞到JSON.parse,不管它是否有效。您看到的異常是json解析器試圖解析Java異常方法,因爲您將stderr重定向爲2>&1而被捕獲。

您需要檢查子進程繼續之前成功完成。最簡單的方法可能是在調用popen之後,使用$?特殊變量,它指示上次執行的子進程的狀態。這個變量是一個實例,如果Process::Status。你可以做這樣的事情:

output = IO.popen(command+" 2>&1") do |io| 
    io.read 
end 

unless $?.success? 
    # Handle the error however you feel is best, e.g. 
    puts "Tika had an error, the message was:\n#{output}" 
    raise "Tika error" 
end 

更多的控制,你可以看看Open3 module標準庫。由於Tika是Java程序,另一種可能性可能是使用JRuby並直接調用它。