Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby IO.popen中运行外部程序:rescue不工作_Ruby_Popen_Apache Tika - Fatal编程技术网

在Ruby IO.popen中运行外部程序:rescue不工作

在Ruby IO.popen中运行外部程序:rescue不工作,ruby,popen,apache-tika,Ruby,Popen,Apache Tika,我正在使用从Microsoft Word文档文件中提取元数据,但如果Tika遇到问题,我的援救措施不是捕获错误,而是退出脚本。我使用的是Windows7和Ruby 1.9.3 我可以修改doc文件,但我想避免在将来的文件中出现这个问题。 如何捕获此错误 JARPATH = "jar/tika-app-1.6.jar" def metadata return @metadata if defined? @metadata switch = '-m -j' begin

我正在使用从Microsoft Word文档文件中提取元数据,但如果Tika遇到问题,我的援救措施不是捕获错误,而是退出脚本。我使用的是Windows7和Ruby 1.9.3 我可以修改doc文件,但我想避免在将来的文件中出现这个问题。 如何捕获此错误

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 org.apache.tika.parser.microsoft.OfficeParser@1006d75 (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>'
c:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.2/lib/json/common.rb:155:在'parse'中:757:线程“main”org.apache.tika.Exception.TikaException中的'Exception'处出现意外标记。TikaException:tika-198:非法IOEXE
从org.apache.tika.parser.microsoft下载。OfficeParser@1006d75(JSON::ParserError)
位于org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:250)
位于org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:244)
位于org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:121)
位于org.apache.tika.cli.TikaCLI$OutputType.process(TikaCLI.java:143)
位于org.apache.tika.cli.TikaCLI.process(TikaCLI.java:422)
位于org.apache.tika.cli.TikaCLI.main(TikaCLI.java:113)
原因:java.io.IOException:头签名无效;读取0x0409000002DA5DB,应为0xE11AB1A1E011CFD0-您的文件似乎不是有效的OLE2文档
位于org.apache.poi.poifs.storage.HeaderBlock(HeaderBlock.java:140)
位于org.apache.poi.poifs.storage.HeaderBlock(HeaderBlock.java:115)
位于org.apache.poi.poifs.filesystem.NPOIFSFileSystem.(NPOIFSFileSystem.java:204)
位于org.apache.poi.poifs.filesystem.NPOIFSFileSystem.(NPOIFSFileSystem.java:163)
位于org.apache.tika.parser.microsoft.OfficeParser.parse(OfficeParser.java:162)
位于org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:244)
... 还有5个
'
来自c:/Ruby193/lib/ruby/gems/1.9.1/gems/json-1.8.2/lib/json/common.rb:155:in'parse'
来自C:/Users/../tika.rb:37:“元数据”中的
来自C:/Users/../index\u helpers.rb:55:in`index\u doc'
from index.rb:39:in'block in'
从索引rb:20:in'each'
from index.rb:20:in'each_with_index'
从index.rb:20:in`'

调用
IO.popen
后,您将把子程序的输出传递给
JSON.parse
,而不管它是否有效。您看到的异常是json解析器试图解析Java异常方法,由于您使用
2>&1
重定向stderr,因此捕获了该异常

在继续之前,您需要检查子进程是否成功完成。最简单的方法可能是使用
$?
特殊变量,该变量指示调用
popen
后最后执行的子进程的状态。此变量是一个实例,如果。你可以这样做:

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

要获得更多控制,可以查看标准库中的。由于Tika是一个Java程序,另一种可能是考虑使用JRuby并直接调用它。

为什么不使用,而不是每次调用应用程序时生成一个新的JVM?你可以在网络上发布你的内容,然后取回元数据或一个错误,与你的Rubyal很好地隔离。因此,stacktrace中的特定错误在最新版本的Apache Tika中得到了修复,你使用旧版本有什么原因吗?@Gagravarr,这里的小企业,需要尽量减少正在运行的服务器进程的数量,唯一运行的Web服务器是我不想使用的IIS和Tomcat。Tika安装了Yomi Gem,我决定不使用它,而是编写自己的类与Tika交互。从命令行运行Tika时会出现相同的错误,我将查看新版本。该代码无效,您有
IO.popen(…)do | IO |。。。救援…
<代码>营救是不允许的,应该有一个
结尾
@peter我只是说要小心。您今天编写的代码“工作正常”,后来当有人上传“Untitled Document.docx”时,它在生产中崩溃了。